HTML文档中的标签或元素排列具有层次性。标签可以嵌套多层。例如,<head>
和<body>
标签都嵌套在<html>
标签内。同样地,一个或多个<li>
标签可能位于<ul>
标签内。在本章中,我们将探讨如何抓取一个含有一个或多个子标签嵌套在内的标签。
让我们考虑以下HTML文档:
<div id="outer">
<div id="inner">
<p>Hello<b>World</b></p>
<img src='logo.jpg'>
</div>
</div>
在这种情况下,两个<div>
标签和一个<p>
标签都有一个或多个嵌套的子元素。然而,<img>
和<b>
标签没有任何子标签。
findChildren()
方法返回一个包含标签下所有子元素的ResultSet。所以,如果一个标签没有任何子元素,ResultSet将会是一个空列表,如[]
。
以此为线索,下面的代码找出了文档树中每个标签下的标签,并显示列表。
示例
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))
print("Child tags: ", tag.findChildren())
print()
输出
Tag: div attributes: {'id': 'outer'}
Child tags: [<div id="inner">
<p>Hello<b>World</b></p>
<img src="logo.jpg"/>
</div>, <p>Hello<b>World</b></p>, <b>World</b>, <img src="logo.jpg"/>]
Tag: div attributes: {'id': 'inner'}
Child tags: [<p>Hello<b>World</b></p>, <b>World</b>, <img src="logo.jpg"/>]
Tag: p attributes: {}
Child tags: [<b>World</b>]
Tag: b attributes: {}
Child tags: []
Tag: img attributes: {'src': 'logo.jpg'}
Child tags: []