开发者社区> 村雨遥> 正文

数据解析之 XPath & lxml 库

简介: 数据解析之 XPath & lxml 库
+关注继续查看

XPath

定义

即XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言,它基于XML的树状结构,提供在数据结构树中寻找节点的能力,也适用于HTML文档中;


开发工具

Chrome

在Chrome的应用商店搜索XPath Helper,然后安装这个插件即可;


image.pngFirefox

同样的方式,在应用中心查找XPath Checker,然后安装这个插件即可,由于未使用Firefox,便不再演示;


语法

节点选取

表达式 描述 示例

nodename 选词当前节点下节点的所有子节点 div

/ 若在最前,则表示从根节点开始选取,否则选择某节点下的某个节点 /div

// 从全局节点中选取某一节点所在所有位置 //div

@ 选取某一节点属性 //div[@color]

. 选取当前节点 ./div

… 选取当前节点的父节点 …/div

谓语

路径表达式 描述

/markstore/mark[1] 选取markstore下第一个元素

/markstore/mark[last()] 选取markstore下倒数第二个mark元素

markstore/mark[position()<5] 选取markstore下前四个子元素

//mark[@id] 选取拥有id的mark元素

//mark[@id=‘k’] 选取id属性为k的mark元素

通配符

通配符 描述

* 匹配任意节点

@* 匹配节点中的任意属性

node() 匹配任何类型的节点

注意事项

使用方式://获取当前页面所有元素,然后写标签名,最后写谓词进行提取;

/和//的区别:/代表只获取直接子节点,//代表获取子孙节点;

lxml库

安装

使用如下命令安装即可,


pip install lxml


使用


from lxml import etree

text = '''
<div>
    <ul>
        <li class="id-1"><a href="www.baidu.com">baidu</a></li>
        <li class="id-2"><a href="www.google.com">Google</a></li>
        <li class="id-3 id-4" name='item'><a href="www.taobao.com">Taobao</li>
    </ul>
</div>
'''
# 解析字符串为html文档
html = etree.HTML(text)
# 字符串序列化为html文档,会自动修正HTML文本
result = etree.tostring(html, encoding='utf-8')
print(result.decode('utf-8'))

# 从文件读取
parser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('csdn.html', parser=parser)

# 获取所有a标签的href属性
aList = html.xpath('//a/@href')
for a in aList:
    print(a)

# 属性多值匹配
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "id-4")/href/text()]')
print(result)

# 多属性匹配
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "id-4") and @name="item"]/href/text()')
print(result)

# 按序选择
text = """
<div> 
<ul> 
<li class="item-0"><a href="link1.html">first item</a></li> 
<li class="item-1"><a href="link2.html">second item</a></li> 
<li class="item-inactive"><a href="link3.html">third item</a></li> 
<li class="item-1"><a href="link4.html">fourth item</a></li> 
<li class="item-0"><a href="links.html">fifth item</a></li> 
</ul> 
</div>
"""
html = etree.HTML(text)
# 注意,xpath匹配中序号是以1开头的,而不是以0开头的
result = html.xpath('//li[1]/a/text()')
print(result)
result = html.xpath('//li[last()]/a//text()')
print(result)
result = html.xpath('//li[last()-2]/a/text()')
print(result)
result = html.xpath('//li[position()<3]/a/text()')
print(result)

总结

本文主要介绍了爬虫中数据解析时所需要的用的XPath和lxml库,介绍了它们的安装方式和简单的使用方式,如果你有更好的建议和想法,欢迎留言指正。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
大数据量下 MyBatis PageHelper 分页查询性能问题的解决办法
项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一直没有什么问题。随着业务扩增,数据库扩增PageHelper出现了明显的性能问题。
305 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19111 0
【JetPack】数据绑定 DataBinding 简介 ( 使用要求 | Gradle 版本 | 定义数据类 | 定义数据绑定布局 | Activity 数据绑定 | 绑定类生成规则 )(一)
【JetPack】数据绑定 DataBinding 简介 ( 使用要求 | Gradle 版本 | 定义数据类 | 定义数据绑定布局 | Activity 数据绑定 | 绑定类生成规则 )(一)
15 0
图解大数据 | 基于Dataframe / SQL大数据处理分析@Spark操作
DataFrame是一个以命名列方式组织的分布式数据集。本文详细讲解 Spark Dataframe的创建方式,Dataframe数据的Agg、Collect、Groupby、Join等核心操作,以及Spark SQL操作核心要点。
41 0
XML学习总结——SAXReader解析xml文件,实现反射 代码实例
XML学习总结——SAXReader解析xml文件,实现反射 代码实例
22 0
+关注
村雨遥
CSDN 博客专家及 Java 领域优质创作者,华为云云享专家。 获取资料,请关注我的公众号(村雨遥)。个人博客:https://cunyu1943.site
263
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载