爬虫之CSS选择器的使用(BeautifulSoup)

1、CSS选择器概述

BeautifulSoup支持大部分的CSS选择器。

语法为:向tag对象或BeautifulSoup对象的.select()方法中传入字符串参数,选择的结果以列表形式返回,即返回类型为list。

tag.select("string")

BeautifulSoup.select("string")

1

2

注:在取得含有特定CSS属性的元素时,标签名不加任何修饰,类名前加点,id名前加#。

2、CSS基本语法

元素选择器:

直接选择文档元素

比如head,p

类选择器:

元素的class属性,比如

类名就是important

.important选择所有有这个类属性的元素

可以结合元素选择器,比如p.important

ID选择器:

元素的id属性,比如

id就是intro

#intro用于选择id=intro的元素

可以结合元素选择器,比如p#intro

属性选择器:

选择有某个属性的元素,而不论值是什么。

*[title]选择所有包含title属性的元素

a[href]选择所有带有href属性的锚元素

还可以选择多个属性,比如:a[href][title],注意这里是要同时满足。

限定值:a[href="www.so.com"]

后代(包含)选择器:

选择某元素后代的元素(层级不受限制)

选择h1元素的em元素:h1 em

子元素选择器:

范围限制在子元素

选择h1元素的子元素strong:h1 > strong

3、CSS测试用例

The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were

,

Lacie and

Tillie;

and they lived at the bottom of a well.

...

4、使用BeautifulSoup

from bs4 import BeautifulSoup

soup = BeautifulSoup(open('test.html'), "html.parser")

1

2

3

5、通过元素标签查找

例1:打印元素的类型和名称

print(type(soup.title))

print(soup.title.name)

1

2

title

例2:选择所有的title标签

print(soup.title)

print(soup.title.string) # 只打印文本

print(soup.select('title'))

1

2

3

The Dormouse's story

The Dormouse's story

[

The Dormouse's story]

例3:选择所有的p标签中的第3个

print(soup.select('p')[1])

1

Once upon a time there were three little sisters; and their names were

,

Lacie and

Tillie;

and they lived at the bottom of a well.

例4:选择body标签下的所有a标签

items = soup.select('body a')

for item in items:

print(item)

1

2

3


Lacie

Tillie

例5:选择body标签下的直接子元素标签a

print(soup.select('body > a'))

print(soup.select('p > a'))

1

2

[]

[, Lacie, Tillie]

例6:选择id=link1后的所有兄弟节点标签。类名前加点,id名前加#

items = soup.select('#link1 ~ .sister')

for item in items:

print(item)

1

2

3

Lacie

Tillie

例7:选择id=link1后的下一个兄弟节点标签

print(soup.select('#link1 + .sister'))

1

[Lacie]

6、通过CSS类名查找

例1:查找class类名为sister的标签。

items = soup.select('.sister')

for item in items:

print(item)

1

2

3


Lacie

Tillie

例2:查找P标签下class类名为title的标签。

items = soup.select('p.title')

for item in items:

print(item)

1

2

3

4

The Dormouse's story

7、通过标签的id属性查找

例1:选择id属性为link2的所有标签。

print(soup.select('#link2'))

1

[Lacie]

例2:选择a标签,其id属性为link2的标签。

print(soup.select('a#link2'))

1

[Lacie]

8、同时用多种CSS选择器查询元素

例1:选择id属性为link2和id属性为link3的所有标签。

items = soup.select('#link2, #link3')

for item in items:

print(item)

1

2

3

Lacie

Tillie

例2:选择class属性为title,id属性为link2和id属性为link3的所有标签。

items = soup.select('.title, #link2, #link3')

for item in items:

print(item)

1

2

3

The Dormouse's story

Lacie

Tillie

9、通过是否存在某个属性来查找

例:查找a标签下存在herf属性的标签。

items = soup.select('a[href]')

for item in items:

print(item)

1

2

3


Lacie

Tillie

10、通过属性的值来查找

例1:选择a标签,其属性href=http://example.com/elsie的所有标签。

items = soup.select('a[href="http://example.com/elsie"]')

for item in items:

print(item)

1

2

3


例2:选择a标签,其href属性以http开头的所有标签。

items = soup.select('a[href^="http"]')

for item in items:

print(item)

1

2

3


Lacie

Tillie

Tillie

例3:选择a标签,其href属性以lie结尾的所有标签。

items = soup.select('a[href$="lie"]')

for item in items:

print(item)

1

2

3

Tillie

例4:选择a标签,其href属性包含.com的标签。

items = soup.select('a[href*=".com"]')

for item in items:

print(item)

1

2

3


Lacie

Tillie

Tillie

11、通过标签逐层查找

例1:首先选中所有的p标签中的第2个标签,然后在该标签中查title的属性值为12的标签。

mytag = soup.select('p')[1]

NA_name = mytag.select('[title="12"]')

print(NA_name)

1

2

3

[]

例2:首先选中所有的p标签中的第2个标签,然后在该标签列表中查找a标签,并将该列表中的第2个标签的文本取出。

mytag = soup.select('p')[1]

href_text = mytag.select('a')[1].get_text()

print(href_text)

Lacie

12、返回查找到的元素的第一个标签

例:选择class类名为sister的所有标签中的第一个。

print(soup.select_one('.sister'))

1