您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch |

自学教程:python爬虫CSS选择器的使用(BeautifulSoup)

51自学网 2019-10-06 13:48:52
  python
这篇教程python爬虫CSS选择器的使用(BeautifulSoup)写得很实用,希望能帮到您。
爬虫之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属性,比如<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")
1
2
3
5、通过元素标签查找
例1:打印元素的类型和名称

print(type(soup.title))
print(soup.title.name)
1
2
<class 'bs4.element.Tag'> 
title

例2:选择所有的title标签

print(soup.title)
print(soup.title.string)  # 只打印文本
print(soup.select('title'))
1
2
3
<title>The Dormouse's story</title> 
The Dormouse's story 
[<title>The Dormouse's story</title>]

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

print(soup.select('p')[1])
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)
1
2
3
<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'))
1
2
[] 
[<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)
1
2
3
<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'))
1
[<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)
1
2
3
<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)
1
2
3
4
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>

7、通过标签的id属性查找
例1:选择id属性为link2的所有标签。

print(soup.select('#link2'))
1
[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

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

print(soup.select('a#link2'))
1
[<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)
1
2
3
<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)
1
2
3
<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)
1
2
3
<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)
1
2
3
<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)
1
2
3
<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)
1
2
3
<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)
1
2
3
<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)
1
2
3
[<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'))
1
<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>
 
7 Steps to Mastering Machine Learning With Python七步掌握用python进行机器学习
使用命令行安装scipy包失败的解决方法
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1