网站首页 > java教程 正文
在网络爬虫开发的过程中,绝大部分情况都需要对HTML页面进行深入的解析。在Python编程环境下,我们通常运用正则表达式来完成对此类页面数据的提取,然而在现实应用场景中,我们难免要应对规模非常庞大的页面结构,此时仅凭正则表达式的力量显然已经无法胜任这项任务。那么,有没有一个更为高效且便捷的解决方法呢?答案是肯定的,这就是众所周知的XPath。
XPath,它其实是XML路径语言(XML Path Language)的缩写形式,作为一种独特的解析语言,XPath主要利用其路径导航特点来在复杂的XML文档对象模型(DOM)中快速查找所需的特定数据实体。正是基于这样的设计理念,XPath首先被广泛运用于XML类型数据的解析与处理领域,但是在今天,随着HTML相关技术的日益普及以及HTML技术本身的发展变化,逐步认识到XPath在HTML解析处理方面同样具有巨大的潜力与优势。基于此种原因,本节文章中主要介绍一下XML的解析过程,以此来抛砖引玉,带入到XPath解析HTML的过程中。
XPath语言拥有丰富且灵活的语法体系,其中包括路径表达式、属性选择器、轴选择器以及节点集函数等核心功能组件。通过掌握并熟练运用上述这些语法工具,用户便可轻松地在复杂的XML文档中进行条理清晰、准确无误的查询及数据操作。
需要特别注意:尽管XML和HTML都是标记型语言,但实际上它并非HTML的超集,实际上性质和功能差异显著。例如,相较之下XML更倾向于承担数据交互的功能,允许进行自主定义的标签定义,而HTML则更加侧重于网页构建过程,具备一套预设的标签元素组合。
XPath 概述
XPath 的主要目的是为了查找结构化标记语言的文档中的数据,因此其拥有很强大的查找功能,我们只须要指定查找路径,既可完成对索要搜索数据的查找。除此以外,XPath 中还提供了大量的内建函数来完成字符串,数字,时间等匹配,并可以完成很多逻辑上的选择。
同时 XPath 也是 W3C 的标准,可以放心的使用,完全不用担心标准的不一致。
使用之前的准备(安装lxml)
XPath 虽然是 W3C 的标准但是在 Python 中并没有提供标准库,因此需要预先安装,在 Python 使用 lxml 库来完成 XPath 的功能。
pip install lxml
假设我们现在有以下内容的 book.xml 文档:
<!-- book.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<bookstore class="root" ref="aaa">
<book>
<title lang="eng">哈利波特</title>
<price>29.99</price>
</book>
<book>
<title lang="chn">西游记</title>
<price>20.00</price>
</book>
<book class="book class">
<title lang="eng">Python编程</title>
<price>39.95</price>
</book>
</bookstore>
获取文档对象
在解析 XML 之前,需要先获取到 xml 的文档结构对象,etree 中提供了 3 中方式来获取文档对象:
第一种: 通过文件获取
# 导入etree类
from lxml import etree
# 读取xml文件
xml_doc = open('book.xml', 'rb')
# 构建文档对象
tree = etree.XML(xml_doc.read())
# 查找书本名字
print(tree.xpath('//book/title/text()'))
# ['哈利波特', '西游记', 'Python编程']
如上边代码中,使用 etree.XML 方法获取到文档对象,然后使用 xpath 方法,并指定 xpath 路径来获取图书的名字,其中 text()是一个内建函数,用于获取节点文本内容。需要注意的是: 使用这种方式获取在读取文档的时候需要使用 rb 模式。
第二种: 直接指定文档路径或文档对象等,使用 open 读取文件,还可以直接使用 etree 中的 parse 方法,通过指定文档路径直接来获取文档对象:
# 以下几种类型都可以作为sorce传入
# - a file name/path
# - a file object
# - a file-like object
# - a URL using the HTTP or FTP protocol
element = etree.parse('book.xml')
第三种:直接将 xml 结构文本转为文档对象:
xml_string = """
<book>
<title lang="eng">哈利波特</title>
<price>29.99</price>
</book>
"""
root = etree.fromstring(xml_string)
print(root.xpath('//book/title/text()'))
# ['哈利波特']
如上述代码中,使用etree.fromstring 方法可以直接将字符串转换为文档对象。
基础使用
etree 对 XML 的功能适用于HTML,因此本节不做过多的展开,更多的内容将在下一篇文章 HTML 解析中完整讲解,以下是解析XML的基础用法。
book.xml 数据依然使用上边的内容:
from lxml import etree
xml_doc = open('book.xml', 'rb')
root = etree.parse('book.xml')
# 获取所有的书名
print(root.xpath('//book/title/text()'))
#['哈利波特', '西游记', 'Python编程']
# 获取价格大于20的图书
print(root.xpath('//book[price>20]/title/text()'))
# ['哈利波特', 'Python编程']
上述代码中使用 xpath 方法来获取有效数据,参数为 xpath 路径表达式,其中 text()为内建函数,用于获取节点字符串,price>20 谓语,表示节点下 price 的值大于 20。
猜你喜欢
- 2024-11-10 Spring 基于 XML 的 IOC(spring xml map)
- 2024-11-10 阿里P7大神,Java学习之路-IO流与XML,超赞分享
- 2024-11-10 如何用Ajax解析json,XML数据格式
- 2024-11-10 Python和XML(python)
- 2024-11-10 Qt开发-流方法解析XML(qt读取文件流)
- 2024-11-10 Kettle(PDI)转换中输出之XML输出详解
- 2024-11-10 Java代码审计之不安全的Java代码(java安全点有哪些)
- 2024-11-10 spring boot Mybatis Mapper.xml使用总结
- 2024-11-10 Redis基本数据结构之字符串(redis的字符串类型是怎样实现的)
- 2024-11-10 Tomcat Server.xml配置详解(tomcat service配置)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)