爬虫速成(三):数据提取(清洗)"/>
爬虫速成(三):数据提取(清洗)
三种方式
解析工具 | 解析速度 | 使用难度 |
---|---|---|
BeautifulSoup | 最慢 | 最简单 |
lxml | 快 | 简单 |
正则 | 最快 | 最难 |
Xpath
xpath类似于前端的元素选择器,大家感兴趣的去系统学习一下xpath语法,但是既然是速成的,我们就不详细介绍了。
建议使用谷歌的xpath插件,名字叫Xpath Helper,我为大家提供了下载地址点击下载
开始实验!
还是老样子,访问我们例子的网站嗷!以提取标题为例.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7
①按下F12,选择选中工具,点击标题,迅速定位标题在html文档中的位置!
②点击元素,右键,选择copy xpath
③将我们复制的xpath,放在xpath插件中进行审查!发现找到了
,兄弟们,听懂掌声!
④进行简单修改,在后面加上/text()用来提取文本信息
⑤复制其标题位置,查看通过怎样定位到其他标题
通过肉眼观察,我们可以发现,是倒数第2个div标签的数字依次增加2,所以我们可以变编写代码啦!!!
代码介绍
import requests
from lxml import etree
url='.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7'
response = requests.get(url).text
data = etree.HTML(response)
for i in range(2,12):title = data.xpath('//*[@id="html"]/body/div[2]/div[1]/div[%s]/div[1]/p[1]/a/b/text()'%(i*2+1))print(title)
- etree.HTML作用是将text文本变成可以试用xpath语法的对象
- title = data.xpath(…%(i*2+1))字符串格式化
- xpath的到的是一个列表,我们可以使用判断是否为空判断是否提取到了信息
其他
关于其他的需求,大家遇到了再百度吧好吧(好)
正则表达式
在python中,支持正则表达式的第三方模块是re模块,我们使用时需要引入。
当然,大家感兴趣可以去系统学习一下正则表达式,还是由于这是速成的,就不做过多介绍了。。。(真的不是因为我懒)
给大家提供一个正则表达式测试软件,大家可以判断自己想要的信息有没有被提取到点击下载
代表元素
符号 | 含义 |
---|---|
. | 代表换行符除外额的任意字符 |
* | 存在或不存在 |
.* | 存在一个或多个字符 |
.5 | 存在五个任意字符 |
? | 贪婪模式与非贪婪模式(默认贪婪) |
关于什么代表数字。小写字母,大写字母大家有兴趣可以自己去查查百度百科,介绍挺详细的
re.findall()
经过我长时间的使用,我发现re.findall()是最好用的提取方法,而且套路单一,,,只需要将我们需要获取的信息放在小括号里就可以了,返回值是列表,找不到就返回空列表。
以我们的案例为例:
import requests
import re
url='.aspx?value=%E6%9D%8E%E6%B8%85%E7%85%A7'
response = requests.get(url)
print(response) # 查看请求状态,200就是成功。
response = response.text
print(response)
poem_title_list=re.findall('<textarea.*id=.*">?(.*》?)https',response)[:-1]
for i in poem_title_list:print(i)
我们在response中搜索,来看看诗集在哪个位置!发现存在于两个地方:
当然我们也可以在原网页查看:
我们试了试,发现提取p标签中的信息很麻烦,需要使用sub清洗一遍,所以我们选择第二个出现的位置
我们吧需要提取的信息放在小括号里,两边是它附近的出现的字符,方便系统定位。下面开始构造正则表达式:
- <textarea是信息出现的起始位置
- 下面我们需要给计算机提供一些提示或者限制
- 第一个.*表示从<textarea开始,后面有若干字符(有或没有),后面写id.*"表示段落中存在id,id后面有若干字符,最后以“结尾
- 我们吧想要的信息放在小括号中,一般只需要写(.*?),再加上特征字符,这里(.*》?)表示有若干字符,以》结尾,使用非贪婪模式。
- https是信息出现的截止位置
re.sub()
当我们提取的信息里有一些脏信息的时候,我们可以使用re.sub()来替换,例如我们获取的信息里有<br />,但是我们不想要,当然我们可以使用内置函数的replace,但是速度很慢,而且正则的替换用法也差不多。
import re
data = '寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两盏淡酒,怎敌他、晚来风急!雁过也,正伤心,却是旧时相识。<br />满地黄花堆积,憔悴损,如今有谁堪摘?守着窗儿,独自怎生得黑!梧桐更兼细雨,到黄昏、点点滴滴。这次第,怎一个愁字了得!(守着窗儿 一作:守著窗儿)'
data = re.sub("<br />","",data)
print(data)
什么是贪婪模式,什么是非贪婪模式?
要知道的是,正则表达式默认使用贪婪模式,加上问号使用非贪婪模式。
贪婪模式:会寻找满足正则规则的最长文本。一次到底,取第一个开头,取最后一个结尾。
非贪婪模式:寻找所有的符合正则规则的文本。取一个开头,取第一个遇到的结尾。
下面为例:
import re
data = "123我爱123帅帅龙123"
print(re.findall("123(.*)123",data))
print(re.findall("123(.*?)123",data))
'''
['我爱123帅帅龙']
['我爱']
'''
Beautifulsoup4
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigatableString
- BeautifulSoup
- Comment
适合新手入门使用,但是有些繁琐,我不做介绍,建议直接上手xpath或者正则表达式
更多推荐
爬虫速成(三):数据提取(清洗)
发布评论