HTML是一种标记语言,由预定义的标签组成。一个标签标记了一段与之关联的文本,使得浏览器可以根据其预定义的意义来渲染这段文本。例如,用<b>
标签标记的单词Hello(例如<b>Hello</b>
),会被浏览器以粗体的形式渲染。
如果我们想要过滤掉HTML文档中不同标签之间的纯文本,我们可以使用Beautiful Soup库中的两种方法之一——get_text()
或 extract()
。
get_text()
方法收集文档中的所有纯文本部分并返回一个字符串。但是,原始文档树不会改变。
在下面的示例中,get_text()
方法移除了所有的HTML标签。
示例
html = '''
<html>
<body>
<p> The quick, brown fox jumps over a lazy dog.</p>
<p> DJs flock by when MTV ax quiz prog.</p>
<p> Junk MTV quiz graced by fox whelps.</p>
<p> Bawds jog, flick quartz, vex nymphs.</p>
</body>
</html>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
text = soup.get_text()
print(text)
输出
The quick, brown fox jumps over a lazy dog.
DJs flock by when MTV ax quiz prog.
Junk MTV quiz graced by fox whelps.
Bawds jog, flick quartz, vex nymphs.
注意,在上述示例中,soup对象仍然包含HTML文档的解析树。
另一种方法是在从soup对象中提取之前收集包含在一个Tag对象内的字符串。在HTML中,有些标签没有字符串属性(我们可以说对于一些标签如<html>
或<body>
,tag.string
是None)。因此,我们将来自所有其他标签的字符串拼接起来,以获得HTML文档中的纯文本。
下面的程序演示了这种方法。
示例
html = '''
<html>
<body>
<p>The quick, brown fox jumps over a lazy dog.</p>
<p>DJs flock by when MTV ax quiz prog.</p>
<p>Junk MTV quiz graced by fox whelps.</p>
<p>Bawds jog, flick quartz, vex nymphs.</p>
</body>
</html>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
tags = soup.find_all()
string = ''
for tag in tags:
if tag.string != None:
string = string + tag.string + '\n'
tag.extract()
print("Document text after removing tags:")
print(string)
print("Document:")
print(soup)
输出
Document text after removing tags:
The quick, brown fox jumps over a lazy dog.
DJs flock by when MTV ax quiz prog.
Junk MTV quiz graced by fox whelps.
Bawds jog, flick quartz, vex nymphs.
Document:
clear()
方法移除了标签对象的内部字符串但并不返回它。类似地,decompose()
方法会销毁标签及其所有子元素。因此,这些方法不适合从HTML文档中检索纯文本。