数据提取之lxml模块与xpath工具
目标:了解xpath的定义
了解lxml
掌握xpath的语法
lxml是一款高新能的python html/xml解析器,我们可以利用xpath,来快速的定位特定元素以及获取节点信息
响应内容:json格式的,所有的响应内容都是json格式的吗?
响应内容是html格式——json取值?
响应内容是html格式——应该怎么取值,xpath数据提取
1. 了解 lxml模块和xpath语法
对html或xml形式的文本提取特定的内容,就需要我 们掌握lxml模块的使用和xpath语法。
(1)lxml模块可以利用XPath规则语法,来快速的定位 HTML\XML 文档中特定元素以及获取节点信息(文本内容、属性值)
(2)XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档 中对元素和属性进行遍历。
W3School官方文档: http://www.w3school.co m.cn/xpath/index.asp
(3)提取xml、html中的数据需要lxml模块和xpath语法 配合使用
xml:用来传输和存储数据
html:专门用来显示数据
需要做数据提取的是:html
借助第三方模块:lxml,使用xpath语法解析html数据
pip install lxml -i 清华源
2.xpath的节点关系
3.xpath语法-基础节点选择语法
(1)XPath使用路径表达式来选取XML文档中的节点或者节点集。
(2) 这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
(3)使用chrome插件选择标签时候,选中时,选中的标签会添加属性class="xh-highlight"(4) 安装
(5) 导入
相关示例代码
# lxml
from lxml import etree'''
xpath解析html网页内容
'''
# 获取的源码
html = '''
<li><div class="item"><div class="pic"><em class="">1</em><a href="https://movie.douban.com/subject/1292052/"><img width="100" alt="肖申克的救赎" src="https://img3.doubanio.com/view/photo/s_ratio_poster/public/p480747492.webp" class=""></a></div><div class="info"><div class="hd"><a href="https://movie.douban.com/subject/1292052/" class=""><span class="title">肖申克的救赎</span><span class="title"> / The Shawshank Redemption</span><span class="other"> / 月黑高飞(港) / 刺激1995(台)</span></a><span class="playable">[可播放]</span></div><div class="bd"><p class="">导演: 弗兰克·德拉邦特 Frank Darabont 主演: 蒂姆·罗宾斯 Tim Robbins /...<br>1994 / 美国 / 犯罪 剧情</p><div class="star"><span class="rating5-t"></span><span class="rating_num" property="v:average">9.7</span><span property="v:best" content="10.0"></span><span>3044286人评价</span></div><p class="quote"><span class="inq">希望让人自由。<a href=""></a></span></p></div></div></div>
</li>
'''# 解析 学习语法
# 数据提取
# 1. 创建对象html: 源码
html = etree.HTML(html)# 解析 语法字符串类型
'''
/: 规定了必须从根节点开始找
//: 不需要考虑节点位置
'''
# # span = html.xpath('//span') # 返回的数据类型的列表,默认查找的是所有的span标签,如果没有定位到对应的标签数据,返回的是空列表
# img = html.xpath('//img')
# span = html.xpath('//p/span/a')
# span = html.xpath('//p/a')
# span = html.xpath('//p//a')
# print(span)'''
text(): 获取文本信息
<em class="">1</em>
1. 先定位到em的标签元素
2. 才能获取文本内容
数据获取
'''
# []
em = html.xpath('//em/text()') # 列表
print(em)
3.1xpath定位节点以及提取属性或文本内容的语法
表达式 | 描述 |
nodename | 选中该元素。 |
/ | 从根节点选取、或者是元素和元素间的过渡。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性,获取对应的属性值 例如:<a href="https://www.baidu.com">百度</a> @href 获取a标签的属性值:https://www.baidu.com 代码:html.xpath('//a/@harf') |
text() | 选取文本。标签之间的内容,如:<a href="https://www.baidu.com">百度</a>的文本信息就是百度 |
表达式描述 nodename选中该元素。
html.xpath()返回的数据类型是列表,如果没有定位到对应的标签数据,返回的是空列表。返回的列表中的内容是元素对象。
4. xpath语法-节点修饰语法
可以根据标签的属性值、下标等来获取特定的节点
4.1根据标签的属性值做标签筛选
(1)标签[@属性名称="属性值"]
<span class="rating_num" property="v:average">9.7</span>
代码:star = html.xpath('//span[@class="rating_num"]/text()')
(2)没有提取到数据,不会报错,空列表 [ ]——[0]:报错 list index out of rangelxml.etree.XPathEvalError: Invalid predicate: xpath语法出现问题
(2)span 没有属性:直接获取所有的span标签?
span不能直接定位,可以定位上一级
敲属性值:复制标签的位置定位
标签属性值一样,但只想获取其中某一个标签, 位置从1开始的代码:
star = html.xpath('//div[@class="star"]/span[2]/text()')#获取class属性为star的div标签下的第2个span标签
print(star)
4.2模糊匹配,标签有共同属性
语法:[contains(@属性名称, '包含的属性值')]
代码:qoute = html.xpath('//p[contains(@class, "quote")]/span/text()')
print(qoute)
5.谷歌浏览器xpath helper插件的安装和使用
(1)下载Chrome插件 XPath Helper 可以在chrome应用商城进行下载
(2)将rar压缩包解压到当前文件夹
(3) 打开谷歌浏览器---->右上角三个点---->更多工具----> 扩展程序
(4)在扩展程序界面,点击右上角的开关,进入开发者模 式后,将xpath文件夹拖进,释放鼠标即可
(5)安装完成,校验(ctrl+shift+x)(重启浏览器)