爬虫常用数据提取方式:正则、xpath、beautifulsoup
文章目录
- 1.正则re
- 2.xpath
- 2.1 定位
- 2.1.1 xpath中选取节点的路径表达式
- 2.1.2 xpath谓语,即[ ]中的内容
- 2.1.3 选取未知节点
- 2.1.4 选择多个路径
- 2.2 获取文本
- 2.2.1 获取标签内的文本
- 2.2.2 获取属性值
- 3. BeautifulSoup
- 3.1 定位
- 3.2 获取文本
requests获取到网页源码之后,往往需要经过数据提取才能获得我们想要的数据,本文将介绍Python爬虫中常用的3中数据提取方式。
正文开始之前,先说一个小tips,有时候requests.xxx.text直接获得的源码中,可能会出现中文乱码的情况,这一问题主要有两种解决方式:
- method1:
response = requests.get() #或者post
response.encoding = 'uft-8'
page_text = response.text
- method2:
该方法只针对某一节点解析出来的中文发生乱码这种情况
str_refine = str_error_code.encode('iso-8859-1').decode('gbk')
正文开始
1.正则re
正则请戳这里
Python的re模块请戳这里
2.xpath
根据HTML标签来提取所需的数据。调用语法:
from lxml import etree
# 使用本地HTML实例化一个etree对象:
tree = etree.parse('filename')
# 使用requests获得的网页源码实例化一个etree对象:
tree = etree.HTML(page_text) #page_text是requests获得的网页源码
2.1 定位
2.1.1 xpath中选取节点的路径表达式
/
:绝对路径,可以看成选择子元素
//
:相对路径,可以看成选择后代元素
.
:选取当前节点
..
:选取当前节点的父节点
@
:选取属性
❤️
node.xpath('./div')
:表示当前节点子元素中,所有div元素;
node.xpath('.//div')
:表示当前节点后代元素中,所有div元素;
node.xpath('//div')
:表示当前HTML页面中,所有div元素(注意是整个HTML页面哈,不论你node是在HTML的哪里)
node.xpath('../@class')
:获取当前节点的父元素的class属性值
2.1.2 xpath谓语,即[ ]中的内容
数字n
:表示第n个元素,索引从1开始,node.xpath(’./a[1]’)表示当前节点的所有a子元素中的第一个;
last()
:表示最后一个元素,node.xpath(’./a[last()]’)表示当前节点的所有a子元素中的最后一个;
last()-1
:倒数第二个元素;
position()<n
:表示选最前面的n-1个元素,node.xpath(’./a[position()<4]’)表示当前节点的前3个a 子元素;
@属性名
:表示含有该属性的元素,node.xpath(’./a[@href]’)表示当前节点中所有带有href属性的a子元素
@属性名="属性值"
:表示含有该属性、并且属性值为指定值的元素,node.xpath(’./a[@href=“www.bjyx.com”]’)表示当前节点中所有带有href属性,并且href属性值为’www.bjyx.com’的a子元素;
contains(@属性名,"部分属性值")
:当属性值不能完全匹配,只知道部分属性值时,可使用contains;node.xapth(’./a[contains(@class,“box”)]表示当前节点中所有带有class属性、并且class属性值中含有’box’的a子元素;
2.1.3 选取未知节点
❤️
2.1.4 选择多个路径
使用|
连接:
❤️
node.xpath('./a | ./b')
:表示当前节点的所有a子元素和b子元素
2.2 获取文本
2.2.1 获取标签内的文本
路径内部:
/text()
:获取直接文本
//text()
:获取直接文本and所有后代元素中的文本
路径外部:
node.text
:获取的是该节点的第一个子元素前的所有直接文本
❤️
<html>
<body><div>这是span前面的文本<span>这是span的文本</span>这是span后面的文本</div>
</body>
</html>
2.2.2 获取属性值
就是2.1.1中提到的@
方法
3. BeautifulSoup
beautifulsoup只能用在Python中,其他语言无法使用。调用语法:
from bs4 import BeautifulSoup
# 实例化本地HTML文件:
f = open('./11.音视频.html','r',encoding='utf-8')
soup = BeautifulSoup(f,'lxml')
# 实例化requests获取的网页源码:
soup = BeautifulSoup(page_text,'lxml')
3.1 定位
<html lang="en">
<head><meta charset="UTF-8"/><title>11.音视频.html</title>
</head>
<body><audio src="../source/音视频/audio.mp3" controls></audio> <audio controls autoplay>对不起,您的浏览器不支持播放音频,请升级浏览器<source src="../source/音视频/audio.mp3"><source src="../source/音视频/audio.ogg"></audio>
<iframe width=500 height=500 frameborder="0" src="https://v.qq.com/txp/iframe/player.html?vid=w0031s4gikk" allowFullScreen="true"></iframe>
<p>body里直接的p标签</p>
<div>
<p class='sen1'>马上要过年啦</p>
<p class='sen2'>大家要开心呀~</p>
<p class='sen2' id=blue>wow!!!</p>
</div>
</body>
</html>
soup.标签名称
:返回html中第一次出现的该标签的全部内容,返回的是一个Tag对象(就相当于一个节点node)。
soup.audio
# 返回结果:<audio controls="" src="../source/音视频/audio.mp3"></audio>
soup.find(标签名称,[属性名=属性值])
:和 soup.标签名称 一样,只返回第一个匹配的
soup.find('audio')
# 返回结果:<audio controls="" src="../source/音视频/audio.mp3"></audio>
soup.find('p',class_='sen2')
# 返回结果:<p class="sen2">大家要开心呀~</p>
# PS:属性名称应该是class,但是class是Python里面的保留关键字,所以就在后面加一个_
soup.find_all
:返回符合要求的所有标签,返回的结果是一个list,list中的每个元素是一个Tag
soup.find_all('audio')
'''
返回结果:
[<audio controls="" src="../source/音视频/audio.mp3"></audio>,<audio autoplay="" controls="">对不起,您的浏览器不支持播放音频,请升级浏览器<source src="../source/音视频/audio.mp3"><source src="../source/音视频/audio.ogg"></source></source></audio>]
'''
soup.select(selector)
:返回的是一个list,其中selector可以是id选择器、类别选择器、标签选择器
print(soup.select('#blue'))# id选择器
print('~'*40)
print(soup.select('.sen2'))# 类别(class)选择器
print('~'*40)
print(soup.select('p'))#标签选择器
print('~'*40)
print(soup.select('body>div>p')) #层级选择器 >表示子元素
print('~'*40)
print(soup.select('body p')) #层级选择器 空格表示后代元素'''
返回结果:
[<p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p>body里直接的p标签</p>, <p class="sen1">马上要过年啦</p>, <p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p class="sen1">马上要过年啦</p>, <p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[<p>body里直接的p标签</p>, <p class="sen1">马上要过年啦</p>, <p class="sen2">大家要开心呀~</p>, <p class="sen2" id="blue">wow!!!</p>]'''
3.2 获取文本
获取标签里面的文本
text/get_text
:获得该标签的直接文本以及后代元素的文本,返回的是字符串
string
:获取该标签的直接文本,返回的是字符串
就与xpath里面的 /text()
和//text()
一样
soup.select('body p')[0].text #soup.select('body p')[0]就是一个节点
# 返回结果:'body里直接的p标签'
获取属性值:
[属性名]
soup.select('div>p')[2]['id'] #获取属性id的属性值,返回值也是一个str
# 返回结果:'blue'
爬虫常用数据提取方式:正则、xpath、beautifulsoup相关推荐
- edge新版 能够正则式_Python爬虫七 数据提取之正则
数据提取之正则,主要用到的re模块. 一.正则表达式 用事先定义好的一些特定字符.及这些特定字符的组合,组成一个规则字符串,这个规则字符串用来表达对字符串的一种过滤逻辑. 二.正则表达式的常见语法 正 ...
- Python爬虫常用的几种数据提取方式
python爬虫的几种数据提取方式:正则 ,bs4,pyquery,xpath,cssselector. 一,正则 提取数据步骤:创建正则对象-->匹配查找-->提取数据保存 <ht ...
- 爬虫之数据提取响应内容的分类
爬虫之数据提取响应内容的分类 在发送请求获取响应之后,可能存在多种不同类型的响应内容:而且很多时候,我们只需要响应内容中的一部分数据 结构化的响应内容 json字符串 [高频出现] 可以使用re. ...
- OJ平台常用数据读取方式
OJ平台常用数据读取方式 1.C格式 读取判断: scanf函数返回值: 1.大于0时,表示正确接收的参数个数. 2.等于0时,表示输入不匹配,无法正确输入任何值. 3.等于-1时,表示EOF(end ...
- Python爬虫的数据提取,一篇博客就搞定啦!
数据提取 目录 数据提取 XPath语法和lxml模块 XPath 什么是XPath XPath开发工具 XPath语法 选取节点: 谓语: 通配符 选取多个路径: 运算符: 总结 使用方式 需要注意 ...
- 爬虫之数据提取jsonpath模块的使用场景和使用方法
1. jsonpath模块的使用场景 如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的.jsonpath模块就能解决这个痛点. jsonpath可以按照key对p ...
- 网络爬虫--13.数据提取之JSON与JsonPATH
文章目录 一. 前言 二. JSON 三. json.loads() 四. json.dumps() 五. json.dump() 六. json.load() 七. JsonPath 八. Json ...
- python爬虫获取标签规则_Python爬虫之数据提取-selenium定位获取标签对象并提取数据...
## selenium提取数据 知识点:了解 driver对象的常用属性和方法 掌握 driver对象定位标签元素获取标签对象的方法 掌握 标签对象提取文本和属性值的方法 1. driver对象的常 ...
- python爬虫科研数据提取_python爬虫数据提取四之pyquery
1 pyquery 简介:同样是一个强大的网页解析工具 它提供了和jQuery类似的语法来解析HTML文档,支持CSS选择器,使用非常方便 2 pyquery基本用法 2.1 安装 pip insta ...
最新文章
- BZOJ1196: [HNOI2006]公路修建问题
- 【302天】跃迁之路——程序员高效学习方法论探索系列(实验阶段60-2017.12.04)...
- php composer 安装,composer安装的方法步骤(图文)
- 阿基米德椭圆规原理,你看懂了吗?
- SCU 4445 Right turn(dfs)题解
- ubuntu下的项目管理工具dia, planner
- Ubuntu18.04 上 phpvirtualbox 折腾记
- js字符串与数字比较大小
- C4 model技术架构图--context图
- 京东微信、手机QQ引领社交化购物趋势
- 如何用安装启动盘启动计算机,如何使用U盘启动进入PE安装系统,小编教你如何安装...
- Moto G 的开发者模式
- 【中秋系列】“Python中秋二维码”来了!扫一扫,会出现……
- android的版本电视怎么投屏,三星电视怎么投屏 三星电视投屏设置方法
- Mybatis中resultMap和resultType
- Java-绘图软件(Windows画板)
- Python下对信号的捕获以及优雅的处理
- 苹果公司的电脑发展史——硬件篇
- IdentityServer4总结
- 安拆网:钢管扣件检测标准是什么?
热门文章
- 阀门的开关方向_阀门的开关方向如何正确操作阀门
- 用计算机制作标准曲线的方法,怎么用分光光度计制作标准曲线_制作标准曲线有什么意义...
- video-player的应用
- 中文自然语言处理--基于 textCNN 的电影推荐系统
- 应届生毕业之后先就业还是先择业?
- js如何下载.apk
- 一加手机怎么root权限_一加 A3010手机怎样Root,如何获取Root权限?
- linux运行QQ,微信,企业微信 (非deepin)
- 计算机视觉二值分类器及判别模型,基于计算机视觉的龙井茶叶嫩芽识别方法-毕业论文.doc...
- 一本看到技巧又能保持阳光心态励志书(来自苏鹏的推荐)——《程序员羊皮卷》连载(4)