page contents

爬虫——css选择器

1、CSS选择器概述,BeautifulSoup支持大部分的CSS选择器。

attachments-2021-08-UzDejbXJ61246371c62bc.jpg

1、CSS选择器概述:BeautifulSoup支持大部分的CSS选择器。 语法为:向tag对象或BeautifulSoup对象的.select()方法中传入字符串参数,选择的结果以列表形式返回,即返回类型为list。

tag.select("string")

BeautifulSoup.select("string")

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

2、CSS基本语法

元素选择器: 

直接选择文档元素

比如head,p

类选择器: 

元素的class属性,比如<h1 class="important">

类名就是important

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

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

ID选择器: 

元素的id属性,比如<h1 id="intro">

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测试用例

<html><head><title>The Dormouse's story</title></head>

<body>

<p class="title" name="dromouse"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were

<a href="http://example.com/elsie" title="12" class="sister" id="link1"><!-- Elsie --></a>,

<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and

<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;

and they lived at the bottom of a well.</p>

<p class="story">...</p>

4、使用BeautifulSoup

from bs4 import BeautifulSoup


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

5、通过元素标签查找

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

print(type(soup.title))

print(soup.title.name)

<class 'bs4.element.Tag'> 

title

例2:选择所有的title标签

print(soup.title)

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

print(soup.select('title'))

<title>The Dormouse's story</title> 

The Dormouse's story 

[<title>The Dormouse's story</title>]


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

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

<p class="story">Once upon a time there were three little sisters; and their names were 

<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, 

<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and 

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>; 

and they lived at the bottom of a well.</p>

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

items = soup.select('body a')

for item in items:

    print(item)

<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- 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>


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


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

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

[] 

[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- 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>]

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

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

for item in items:

    print(item)

<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> 

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

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

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

[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

6、通过CSS类名查找

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

items = soup.select('.sister')

for item in items:

    print(item)

<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- 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>

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

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

for item in items:

    print(item)

<p class="title" name="dromouse"><b>The Dormouse's story</b></p>

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

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

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

[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

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

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

[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

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

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

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

for item in items:

    print(item)

<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> 

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>


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

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

for item in items:

    print(item)

<p class="title" name="dromouse"><b>The Dormouse's story</b></p> 

<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> 

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

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

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

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

for item in items:

    print(item)

<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- 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>

10、通过属性的值来查找

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

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

for item in items:

    print(item)

<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>

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

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

for item in items:

    print(item)

<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- 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> 

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

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

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

for item in items:

    print(item)

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

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

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

for item in items:

    print(item)

<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- 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> 

<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

11、通过标签逐层查找

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

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

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

print(NA_name)

[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>]

例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'))

 更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-RMCMnpmR62afccefcbda9.jpeg

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章