Beautiful Soup 对象
任何BeautifulSoup项目的起点都是BeautifulSoup对象。BeautifulSoup对象代表用于创建它的输入HTML/XML文档。
我们可以为Beautiful Soup传递一个字符串或者类似文件的对象,其中文件(对象)可以是在我们的本地机器上存储的,也可以是一个网页。
最常见的BeautifulSoup对象有:
- Tag
- NavigableString
- BeautifulSoup
- Comment
比较对象是否相等
根据beautiful soup的规定,如果两个NavigableString或者Tag对象表示相同的HTML/XML标记,则它们相等。
现在让我们看下面的例子,在这个例子中,即使两个<b>
标签位于对象树的不同部分,它们被认为是相等的,因为它们看起来都是“ Java ”。
>>> 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
然而,为了检查这两个变量是否引用相同的对象,你可以使用以下方法−
>>> print(first_b is second_b)
False
复制Beautiful Soup对象
要创建任何标签或NavigableString的副本,请使用copy.copy()函数,就像下面这样-
>>> 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>
>>>
尽管这两个副本(原始和复制)包含相同的标记,但两个副本并不代表相同的对象−
>>> print(soup.p == p_copy)
True
>>>
>>> print(soup.p is p_copy)
False
>>>
唯一真正的区别是复制品与原始的Beautiful Soup对象树完全分离,就好像对它调用了extract()方法一样。
>>> print(p_copy.parent)
None
上述行为是由于两个不同的标签对象无法同时占用同一空间。