在HTML中有两种类型的标签。许多标签是以成对的形式出现,包括开始标签和结束标签。比如最顶层的<html>标签就有对应的结束标签</html>,这是主要的例子之一。其他的例子还有<body>和</body>、<p>和</p>、<h1>和</h1>等等。另外一些标签则是自闭合标签——例如<img>和<a>。自闭合标签通常不包含像那些成对标签(如<b>Hello</b>)中的文本。
本章我们将探讨如何利用Beautiful Soup库获取成对标签内的文本部分。
获取文本的方法
在Beautiful Soup中,有多种方法/属性可以用来获取与标签对象相关的文本。
方法及其描述
| Sr.No |
方法 & 描述 |
| 1 |
text属性 获取PageElement的所有子字符串,如果指定了分隔符,则使用分隔符连接起来。 |
| 2 |
string属性 提供了从子元素中获取字符串的便利属性。 |
| 3 |
strings属性 从当前PageElement下的所有子对象中产生字符串部分。 |
| 4 |
stripped_strings属性 与strings属性相同,但在去除换行符和空白字符后产生结果。 |
| 5 |
get_text()方法 返回PageElement的所有子字符串,如果指定了分隔符,则使用分隔符连接起来。 |
考虑以下HTML文档:
<div id="outer">
<div id="inner">
<p>Hello<b>World</b></p>
<img src='logo.jpg'>
</div>
</div>
如果我们检索解析文档树中每个标签的stripped_string属性,我们会发现两个div标签和p标签各自有两个NavigableString对象,“Hello”和“World”。<b>标签嵌入了“World”字符串,而<img>标签则没有文本部分。
下面的示例从给定的HTML文档中的每个标签中获取文本:
示例
html = """
<div id="outer">
<div id="inner">
<p>Hello<b>World</b></p>
<img src='logo.jpg'>
</div>
</div>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
for tag in soup.find_all():
print("Tag: {} attributes: {} ".format(tag.name, tag.attrs))
for txt in tag.stripped_strings:
print(txt)
print()
输出
Tag: div attributes: {'id': 'outer'}
Hello
World
Tag: div attributes: {'id': 'inner'}
Hello
World
Tag: p attributes: {}
Hello
World
Tag: b attributes: {}
World
Tag: img attributes: {'src': 'logo.jpg'}