Beautiful Soup 简明教程

Beautiful Soup - Find all Children of an Element

HTML 脚本中标记的结构是分层的。元素一个嵌套在另一个里面。例如,最顶层的 <HTML> 标记包含 <HEAD> 和 <BODY> 标记,每个都可以包含其他的标记。最顶层元素被称为父元素。嵌套在父元素内的元素是其子元素。借助 Beautiful Soup,我们可以找到父元素的所有子元素。在本章中,我们将找出如何获取 HTML 元素的子元素。

BeautifulSoup 类中有两个配置,用于获取子元素。

  1. The .children property

  2. The findChildren() method

本章中的示例使用了以下 HTML 脚本 (index.html)

<html>
<head>
<title>TutorialsPoint</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>

Using .children property

Tag 对象的 .children 属性以递归方式返回所有子元素的生成器。

以下 Python 代码给出了最顶层的 <ul> 标记的所有子元素的列表。我们首先获取与 <ul> 标记相对应的 Tag 元素,然后读取其 .children 属性

Example

from bs4 import BeautifulSoup

with open("index.html") as fp:
   soup = BeautifulSoup(fp, 'html.parser')

tag = soup.ul
print (list(tag.children))

Output

['\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 属性返回一个 list_iterator,所以我们可以使用一个 for 循环来遍历体系结构。

for child in tag.children:
   print (child)

Output

<li>Accounts</li>

<ul>
<li>Anand</li>
<li>Mahesh</li>
</ul>

<li>HR</li>

<ul>
<li>Rani</li>
<li>Ankita</li>
</ul>

Using findChildren() method

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> 元素下的子元素。代码如下 -

Example

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> 元素。

Output

<li>Anand</li>
<li>Mahesh</li>

因此,BeautifulSoup 让解析任何顶层 HTML 元素下的子元素变得非常简单。