在 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>