在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'}