Beautiful Soup - 查找元素的所有子元素



HTML脚本中标签的结构是分层的。元素嵌套在彼此内部。例如,顶级<HTML>标签包含<HEAD>和<BODY>标签,每个标签都可能包含其他标签。顶级元素称为父元素。嵌套在父元素内部的元素是其子元素。借助Beautiful Soup,我们可以找到父元素的所有子元素。本章我们将了解如何获取HTML元素的子元素。

BeautifulSoup类中有两种方法可以获取子元素。

  • .children 属性
  • findChildren() 方法

本章中的示例使用以下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>

使用 .children 属性

Tag对象的 .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元素下的子元素变得非常容易。

广告
© . All rights reserved.