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。