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元素下的子元素變得非常容易。

廣告