Beautiful Soup API中主要的对象之一是NavigableString
类的对象。它代表大多数HTML标签的开头和结尾之间的字符串或文本。例如,如果<b>Hello</b>
是待解析的标记,那么Hello
就是一个NavigableString
。
NavigableString
类继承自bs4
包中的PageElement
类以及Python内置的str
类。因此,它继承了来自PageElement
的方法,如find_*()
, insert
, append
, wrap
, unwrap
等方法,同时也继承了来自str
类的方法,如upper
, lower
, find
, isalpha
等。
这个类的构造函数接受一个参数,即一个str
对象。
示例
from bs4 import NavigableString
new_str = NavigableString('world')
现在你可以使用这个NavigableString
对象来执行各种操作,比如append
, insert
, find
等。
在下面的例子中,我们将新创建的NavigableString
对象附加到现有的Tag对象上。
示例
from bs4 import BeautifulSoup, NavigableString
markup = '<b>Hello</b>'
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.b
new_str = NavigableString('world')
tag.append(new_str)
print(soup)
输出
<b>Helloworld</b>
注意NavigableString
是一个PageElement
,因此也可以附加到Soup对象上。看看如果我们这样做有什么区别。
示例
new_str = NavigableString('world')
soup.append(new_str)
print(soup)
输出
<b>Hello</b>world
正如我们所见,字符串出现在<b>
标签之后。
Beautiful Soup提供了一个new_string()
方法。可以创建一个新的与该BeautifulSoup对象关联的NavigableString
。
让我们使用new_string()
方法来创建一个NavigableString
对象,并将其添加到PageElements
中。
示例
from bs4 import BeautifulSoup, NavigableString
markup = '<b>Hello</b>'
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.b
ns = soup.new_string(' World')
tag.append(ns)
print(tag)
soup.append(ns)
print(soup)
输出
<b>Hello World</b>
<b>Hello</b> World
我们在这里发现了一个有趣的行为。NavigableString
对象既被添加到了树内的标签中,也被添加到了Soup对象本身。虽然标签显示了附加的字符串,但是在Soup对象中,文本World
被附加了,但它没有显示在标签中。这是因为new_string()
方法创建了一个与Soup对象关联的NavigableString
。