学科分类
目录
网络爬虫

通过CSS选择器进行搜索

除了bs4库提供的操作方法以外,还可以使用CSS选择器进行查找。什么是CSS呢?CSS即层叠样式表(英文全称Cascading Style Sheets,简称CSS),是一种用来表现HTML或XML等文件样式的计算机语言,它不仅可以静态地修饰网页,而且可以配合各种脚本语言动态地对网页各元素进行格式化。要想使用CSS对HTML页面中的元素实现一对一、一对多或多对一的控制,就需要用到CSS选择器。

什么是CSS选择器呢?每一条CSS样式定义均由两部分组成,形式如下:

[code] 选择器{样式} [/code]

其中,在{}之前的部分就是“选择器”。选择器指明了{}中样式的作用对象,也就是“样式”作用于网页中的哪些元素。

为了使用CSS选择器达到筛选节点的目的,在bs4库的BeautifulSoup类中提供了一个select()方法,该方法会将搜索到的结果放到列表中。

CSS选择器的查找方式比较多,可以分为如下几种:

1. 通过标签查找

在编写CSS时,标签的名称不用加任何修饰。调用select()方法时,可以传入包含某个标签的字符串,使用CSS选择器查找标签的示例如下:

soup.select("title")
# 查找的结果可能为
# [<title>The Dormouse's story</title>]

2. 通过类名查找

在编写CSS时,需要在类名的前面加上“.”。例如,查找类名为sister的标签,具体示例如下。

soup.select('.sister')
# 查找的结果可能为
#[<a class="sister" href="http://example.com/elsie" id="link1">
<!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie"
id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie"
id="link3">Tillie</a>]

3. 通过id名查找

在编写CSS时,需要在id名称的前面加上“#”。例如,查找id名为link1的标签,具体示例如下。

soup.select("#link1")
# 查找的结果可能为
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

4. 通过组合的形式查找

组合查找与编写class文件时标签名、类名、id名的组合原理一样,二者需要用空格分开。例如,在标签p中,查找id值等于link1的内容,

soup.select('p #link1')
# 查找的结果可能为
#[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

可以使用“>”将标签与子标签分隔,从而找到某个标签下的直接子标签,具体示例代码如下。

soup.select("head > title")
# 查找的结果可能为
# [<title>The Dormouse's story</title>]

5. 通过属性查找

可以通过属性元素进行查找,属性需要用中括号括起来。不过,属性和标签属于同一个节点,它们中间不能加空格,否则将无法匹配到,具体示例如下。

soup.select('a[href="http://example.com/elsie"]')
# 查找的结果可能为
#[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

同样,属性仍然可以与上述查找方式组合,即不在同一节点的属性使用空格隔开,同一节点的属性之间不加空格,具体示例如下。

soup.select('p a[href="http://example.com/elsie"]')
# 查找的结果可能为
#[<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]

上述这些查找的方式,都会返回一个列表。遍历这个列表,可以调用 get_text() 方法来获取节点的内容,具体示例如下。

soup = BeautifulSoup(html_doc, 'lxml')
for element in soup.select('a'):
  print(element.get_text()) # 获取节点的内容
# 获取到节点的内容可能为
Elsie
Lacie
Tillie
点击此处
隐藏目录