在 Beautiful Soup 库中,select()
方法是一个用于抓取 HTML/XML 文档的重要工具。类似于 find()
和其他 find_*()
方法,select()
方法也帮助定位满足给定条件的元素。然而,find*()
方法根据标签名及其属性搜索 PageElements,而 select()
方法根据给定的 CSS 选择器搜索文档树。
Beautiful Soup 还有一个 select_one()
方法。select()
和 select_one()
之间的区别在于 select()
返回一个包含所有属于 PageElement 并且由 CSS 选择器定义的元素的 ResultSet;而 select_one()
返回第一个满足基于 CSS 选择器选择标准的元素。
在 Beautiful Soup 版本 4.7 之前,select()
方法只支持常见的 CSS 选择器。到了版本 4.7,Beautiful Soup 整合了 Soup Sieve CSS 选择器库。结果,现在可以使用更多的选择器。在版本 4.12 中,除了现有的 select()
和 select_one()
方法外,还增加了一个 .css
属性。select()
方法的参数如下:
select(selector, limit, **kwargs)
-
selector
- 包含一个 CSS 选择器的字符串。
-
-
如果 limit
参数设置为 1,那么它等同于 select_one()
方法。虽然 select()
方法返回一个 Tag 对象的 ResultSet,但是 select_one()
方法返回一个单一的 Tag 对象。
Soup Sieve 库
Soup Sieve 是一个 CSS 选择器库。它已经整合到 Beautiful Soup 4 中,因此它会随着 Beautiful Soup 包一起安装。它提供了使用现代 CSS 选择器来选择、匹配和过滤文档树标签的能力。目前 Soup Sieve 实现了大部分从 CSS Level 1 规范到 CSS Level 4 的 CSS 选择器,除了那些尚未实现的选择器。
Soup Sieve 库有不同的类型的 CSS 选择器。基本的 CSS 选择器包括:
类型选择器
通过节点名称匹配元素。例如:
tags = soup.select('div')
通用选择器 (*)
它匹配任何类型的元素。例如:
tags = soup.select('*')
ID 选择器
根据元素的 id 属性进行匹配。符号 # 表示 ID 选择器。例如:
tags = soup.select("#nm")
示例
from bs4 import BeautifulSoup
html = '''
<form>
<input type = 'text' id = 'nm' name = 'name'>
<input type = 'text' id = 'age' name = 'age'>
<input type = 'text' id = 'marks' name = 'marks'>
</form>
'''
soup = BeautifulSoup(html, 'html.parser')
obj = soup.select("#nm")
print(obj)
输出
[<input id="nm" name="name" type="text"/>]
类选择器
根据类属性中的值匹配元素。类名前缀的 . 符号是 CSS 类选择器。例如:
tags = soup.select(".submenu")
属性选择器
根据元素的属性进行匹配。
soup.select('[attr]')
示例
from bs4 import BeautifulSoup
html = '''
<h1>Yoagoa Online Library</h1>
<p><b>It's all Free</b></p>
<a class="prog" href="https://www.yoagoa.com/java/java_overview.htm" id="link1">Java</a>
<a class="prog" href="https://www.yoagoa.com/cprogramming/index.htm" id="link2">C</a>
'''
soup = BeautifulSoup(html, 'html5lib')
print(soup.select('[href]'))
输出
[<a class="prog" href="https://www.yoagoa.com/java/java_overview.htm" id="link1">Java</a>, <a class="prog" href="https://www.yoagoa.com/cprogramming/index.htm" id="link2">C</a>]
拟类选择器
CSS 规范定义了许多拟 CSS 类。拟类是在选择器上添加的一个关键字,用于定义所选元素的一种特殊状态。它为现有元素增加了效果。例如,:link
选择了一个还没有被访问过的链接(每个带有 href
属性的 <a>
和 <area>
元素)。
拟类选择器 nth-of-type
和 nth-child
非常常用。
:nth-of-type()
选择器 :nth-of-type()
根据它们在一组兄弟元素中的位置匹配给定类型元素。关键词 even
和 odd
分别会选择从一组兄弟元素的子组中选择元素。
在下面的例子中,选择了第二个 <p>
类型的元素。
示例
from bs4 import BeautifulSoup
html = '''
<p id="0"></p>
<p id="1"></p>
<span id="2"></span>
<span id="3"></span>
'''
soup = BeautifulSoup(html, 'html5lib')
print(soup.select('p:nth-of-type(2)'))
输出
[<p id="1"></p>]
:nth-child()
这个选择器根据它们在一组兄弟元素中的位置来匹配元素。关键词 even
和 odd
分别会选择位置为偶数或奇数的元素。
用法:
:nth-child(even)
:nth-child(odd)
:nth-child(2)
示例
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>