Beautiful Soup - Beautiful 对象

任何 BeautifulSoup 项目的起点都是 BeautifulSoup 对象。 BeautifulSoup 对象表示用于创建它的输入 HTML/XML 文档。

我们可以为 Beautiful Soup 传递一个字符串或一个类似文件的对象,其中文件(对象)要么存储在我们的机器本地,要么存储在网页中。

最常见的 BeautifulSoup 对象是 −

  • 标签
  • NavigableString
  • BeautifulSoup
  • 注释

比较对象是否相等

根据 beautiful soup,如果两个可NavigableString或标记对象表示相同的 HTML/XML 标记,则它们是相等的。

现在让我们看下面的例子,其中两个 <b> 标记被视为相等,即使它们位于对象树的不同部分,因为它们看起来都像 "<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

但是,要检查两个变量是否引用相同的对象,您可以使用以下 −

>>> 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

上述行为是由于两个不同的标签对象不能同时占据相同的空间。