HTML 标签结构是层次化的。元素相互嵌套。例如,顶级的 <HTML>
标签包括 <HEAD>
和 <BODY>
标签,每个标签内部又可能包含其他标签。顶级元素被称为父级元素。嵌套在其内部的元素则是其子元素。借助 Beautiful Soup,我们可以找到所有父级元素的子元素。在这一章中,我们将探讨如何获取 HTML 元素的子元素。
BeautifulSoup 类中有两种方式来获取子元素:
.children
属性
findChildren()
方法
示例章节使用的 HTML 脚本如下(index.html):
<html>
<head>
<title>Yoagoa</title>
</head>
<body>
<h2>Departmentwise Employees</h2>
<ul id="dept">
<li>Accounts</li>
<ul id='acc'>
<li>Anand</li>
<li>Mahesh</li>
</ul>
<li>HR</li>
<ul id="HR">
<li>Rani</li>
<li>Ankita</li>
</ul>
</ul>
</body>
</html>
使用 .children
属性
.children
属性返回一个生成器,包含所有子元素,递归方式。
下面的 Python 代码给出了顶级 <ul>
标签的所有子元素的列表。我们首先获得对应于 <ul>
标签的 Tag 元素,然后读取其 .children
属性。
示例
from bs4 import BeautifulSoup
with open("index.html") as fp:
soup = BeautifulSoup(fp, 'html.parser')
tag = soup.ul
print (list(tag.children))
输出
['\n', <li>Accounts</li>, '\n', <ul>
<li>Anand</li>
<li>Mahesh</li>
</ul>, '\n', <li>HR</li>, '\n', <ul>
<li>Rani</li>
<li>Ankita</li>
</ul>, '\n']
由于 .children
属性返回一个列表迭代器,我们可以使用一个 for 循环来遍历这个层次结构。
for child in tag.children:
print (child)
输出
<li>Accounts</li>
<ul>
<li>Anand</li>
<li>Mahesh</li>
</ul>
<li>HR</li>
<ul>
<li>Rani</li>
<li>Ankita</li>
</ul>
使用 findChildren()
方法
findChildren()
方法提供了一个更全面的选择。它返回任何顶层标签下的所有子元素。
在 index.html
文档中,我们有两个嵌套的无序列表。顶层的 <ul>
元素的 id 是 "dept",而两个封闭的列表分别具有 id "acc" 和 "HR"。
在下面的例子中,我们首先实例化一个指向顶层 <ul>
元素的 Tag 对象,并从中提取子元素列表。
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
tag = soup.find("ul", {"id": "dept"})
children = tag.findChildren()
for child in children:
print(child)
请注意,结果集中包含的是元素下所有子元素的递归形式。因此,在下面的输出中,您将看到整个内部列表,随后是其中的单个元素。
<li>Accounts</li>
<ul id="acc">
<li>Anand</li>
<li>Mahesh</li>
</ul>
<li>Anand</li>
<li>Mahesh</li>
<li>HR</li>
<ul id="HR">
<li>Rani</li>
<li>Ankita</li>
</ul>
<li>Rani</li>
<li>Ankita</li>
让我们提取具有 id='acc' 的内部 <ul>
元素下的子元素。以下是代码:
示例
from bs4 import BeautifulSoup
fp = open('index.html')
soup = BeautifulSoup(fp, 'html.parser')
tag = soup.find("ul", {"id": "acc"})
children = tag.findChildren()
for child in children:
print(child)
当运行上述程序时,您将得到 id 为 "acc" 的 <ul>
下的 <li>
元素。
输出
<li>Anand</li>
<li>Mahesh</li>
因此,BeautifulSoup 使得解析任何顶层 HTML 元素下的子元素变得非常容易。