Beautiful Soup - Đồ vật đẹp
Điểm bắt đầu của bất kỳ dự án BeautifulSoup nào, là đối tượng BeautifulSoup. Đối tượng BeautifulSoup đại diện cho tài liệu HTML / XML đầu vào được sử dụng để tạo nó.
Chúng tôi có thể chuyển một chuỗi hoặc một đối tượng giống tệp cho Beautiful Soup, nơi các tệp (đối tượng) được lưu trữ cục bộ trong máy của chúng tôi hoặc một trang web.
Đối tượng BeautifulSoup phổ biến nhất là -
- Tag
- NavigableString
- BeautifulSoup
- Comment
So sánh các đối tượng để bình đẳng
Theo cách nói đẹp đẽ, hai đối tượng chuỗi hoặc thẻ có thể điều hướng bằng nhau nếu chúng đại diện cho cùng một đánh dấu HTML / XML.
Bây giờ chúng ta hãy xem ví dụ dưới đây, trong đó hai thẻ <b> được coi là ngang nhau, mặc dù chúng nằm ở các phần khác nhau của cây đối tượng, vì cả hai đều giống “<b> Java </b>”.
>>> markup = "<p>Learn Python and <b>Java</b> and advanced <b>Java</b>! from Tutorialspoint</p>"
>>> soup = BeautifulSoup(markup, "html.parser")
>>> first_b, second_b = soup.find_all('b')
>>> print(first_b == second_b)
True
>>> print(first_b.previous_element == second_b.previous_element)
False
Tuy nhiên, để kiểm tra xem hai biến có tham chiếu đến cùng các đối tượng hay không, bạn có thể sử dụng như sau:
>>> print(first_b is second_b)
False
Sao chép các đối tượng Soup đẹp
Để tạo bản sao của bất kỳ thẻ nào hoặc NavigableString, hãy sử dụng hàm copy.copy (), giống như bên dưới:
>>> import copy
>>> p_copy = copy.copy(soup.p)
>>> print(p_copy)
<p>Learn Python and <b>Java</b> and advanced <b>Java</b>! from Tutorialspoint</p>
>>>
Mặc dù hai bản sao (bản gốc và bản được sao chép) chứa cùng một đánh dấu, tuy nhiên, hai bản không đại diện cho cùng một đối tượng -
>>> print(soup.p == p_copy)
True
>>>
>>> print(soup.p is p_copy)
False
>>>
Sự khác biệt thực sự duy nhất là bản sao hoàn toàn tách rời khỏi cây đối tượng Beautiful Soup ban đầu, giống như khi trích xuất () đã được gọi trên nó.
>>> print(p_copy.parent)
None
Hành vi trên là do hai đối tượng thẻ khác nhau không thể chiếm cùng một không gian cùng một lúc.