爬虫速成(三):数据提取(清洗)

三种方式

解析工具解析速度使用难度
BeautifulSoup最慢最简单
lxml简单
正则最快最难

Xpath

xpath类似于前端的元素选择器,大家感兴趣的去系统学习一下xpath语法,但是既然是速成的,我们就不详细介绍了。
建议使用谷歌的xpath插件,名字叫Xpath Helper,我为大家提供了下载地址点击下载

开始实验!

还是老样子,访问我们例子的网站嗷!以提取标题为例https://so.gushiwen.cn/search.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='https://so.gushiwen.cn/search.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='https://so.gushiwen.cn/search.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或者正则表达式

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笼中小夜莺

嘿嘿嘿,请用金钱尽情地蹂躏我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值