Beautiful Soup - 选择第n个子元素



HTML 的特点是标签的层次顺序。例如,<html> 标签包含 <body> 标签,在 <body> 标签内部可能存在 <div> 标签,并且 <div> 标签内部可能分别嵌套 <ul> 和 <li> 元素。findChildren() 方法和 .children 属性都返回一个包含元素所有直接子标签的 ResultSet(列表)。通过遍历列表,可以获取位于所需位置的子元素,即第 n 个子元素。

下面的代码使用了 HTML 文档中 <div> 标签的 children 属性。由于 children 属性的返回类型是列表迭代器,因此我们将从中检索一个 Python 列表。我们还需要从迭代器中移除空格和换行符。完成后,我们就可以获取所需的子元素。此处显示了 <div> 标签索引为 1 的子元素。

示例

from bs4 import BeautifulSoup, NavigableString

markup = '''
   <div id="Languages">
      <p>Java</p> <p>Python</p> <p>C++</p>
   </div>
'''
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.div
children = tag.children
childlist = [child for child in children if child not in ['\n', ' ']]
print (childlist[1])

输出

<p>Python</p>

要使用 findChildren() 方法代替 children 属性,请将语句更改为

children = tag.findChildren()

输出不会有任何变化。

定位第 n 个子元素的更有效方法是使用 select() 方法。select() 方法使用 CSS 选择器从当前元素获取所需的 PageElements。

Soup 和 Tag 对象通过其 .css 属性支持 CSS 选择器,该属性是 CSS 选择器 API 的接口。选择器实现由 Soup Sieve 包处理,该包与 bs4 包一起安装。

Soup Sieve 包定义了不同类型的 CSS 选择器,即简单、复合和复杂 CSS 选择器,它们由一个或多个类型选择器、ID 选择器、类选择器组成。这些选择器在 CSS 语言中定义。

Soup Sieve 中也有伪类选择器。CSS 伪类是添加到选择器中的一个关键字,用于指定所选元素的特殊状态。在本例中,我们将使用 :nth-child 伪类选择器。由于我们需要从 <div> 标签的第 2 个位置选择一个子元素,因此我们将 :nthchild(2) 传递给 select_one() 方法。

示例

from bs4 import BeautifulSoup, NavigableString

markup = '''
   <div id="Languages">
      <p>Java</p> <p>Python</p> <p>C++</p>
   </div>
'''
soup = BeautifulSoup(markup, 'html.parser')
tag = soup.div

child = tag.select_one(':nth-child(2)')
print (child)

输出

<p>Python</p>

我们得到与 findChildren() 方法相同的结果。请注意,子元素编号从 1 开始,而不是像 Python 列表那样从 0 开始。

广告

© . All rights reserved.