zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Python:XPath与lxml类库(二)

Python 类库 xpath lxml
2023-09-27 14:25:57 时间
什么是XPath


XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言 可用来在 XML 文档中对元素和属性进行遍历。


W3School官方文档 http://www.w3school.com.cn/xpath/index.asp


XPath 开发工具


开源的XPath表达式编辑工具:XMLQuire(XML格式文件可用)Chrome插件 XPath HelperFirefox插件 XPath Checker


选取节点


XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。


下面列出了最常用的路径表达式


image.png


在下面的表格中 我们已列出了一些路径表达式以及表达式的结果


image.png


谓语 Predicates


谓语用来查找某个特定的节点或者包含某个指定的值的节点 被嵌在方括号中。


在下面的表格中 我们列出了带有谓语的一些路径表达式 以及表达式的结果


image.png


选取未知节点


XPath 通配符可用来选取未知的 XML 元素。


image.png


在下面的表格中 我们列出了一些路径表达式 以及这些表达式的结果


image.png


选取若干路径


通过在路径表达式中使用“|”运算符 您可以选取若干个路径。


实例


在下面的表格中 我们列出了一些路径表达式 以及这些表达式的结果


image.png


XPath的运算符


下面列出了可用在 XPath 表达式中的运算符


20191023183712537.png


这些就是XPath的语法内容 在运用到Python抓取时要先转换为xml。


lxml库


lxml 是 一个HTML/XML的解析器 主要的功能是如何解析和提取 HTML/XML 数据。


lxml和正则一样 也是用 C 实现的 是一款高性能的 Python HTML/XML 解析器 我们可以利用之前学习的XPath语法 来快速的定位特定元素以及节点信息。


lxml python 官方文档 http://lxml.de/index.html


需要安装C语言库 可使用 pip 安装 pip install lxml 或通过wheel方式安装


初步使用


我们利用它来解析 HTML 代码 简单示例


# lxml_test.py

# 使用 lxml 的 etree 库

from lxml import etree 

text 

 div 

 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 link5.html fifth item /a # 注意 此处缺少一个 /li 闭合标签

 /ul 

 /div 

#利用etree.HTML 将字符串解析为HTML文档

html etree.HTML(text) 

# 按字符串序列化HTML文档

result etree.tostring(html) 

print(result)


输出结果


 html body 

 div 

 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 link5.html fifth item /a /li 

 /ul 

 /div 

 /body /html 


lxml 可以自动修正 html 代码 例子里不仅补全了 li 标签 还添加了 body html 标签。


文件读取


除了直接读取字符串 lxml还支持从文件里读取内容。我们新建一个hello.html文件


 !-- hello.html -- 

 div 

 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 span class bold third item /span /a /li 

 li class item-1 a href link4.html fourth item /a /li 

 li class item-0 a href link5.html fifth item /a /li 

 /ul 

 /div 


再利用 etree.parse() 方法来读取文件。


# lxml_parse.py

from lxml import etree

# 读取外部文件 hello.html

html etree.parse( ./hello.html )

result etree.tostring(html, pretty_print True)

print(result)


输出结果与之前相同


 html body 

 div 

 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 link5.html fifth item /a /li 

 /ul 

 /div 

 /body /html 


XPath实例测试


1. 获取所有的

标签


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

print type(html) # 显示etree.parse() 返回类型

result html.xpath( //li )

print result # 打印 li 标签的元素集合

print len(result)

print type(result)

print type(result[0])


输出结果


 type lxml.etree._ElementTree 

[ Element li at 0x1014e0e18 , Element li at 0x1014e0ef0 , Element li at 0x1014e0f38 , Element li at 0x1014e0f80 , Element li at 0x1014e0fc8 ]

 type list 

 type lxml.etree._Element 


2. 继续获取

标签的所有 class属性


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

result html.xpath( //li/ class )

print result


运行结果


[ item-0 , item-1 , item-inactive , item-1 , item-0 ]


3. 继续获取 li 标签下hre 为 link1.html 的 a 标签


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

result html.xpath( //li/a[ href link1.html ] )

print result


运行结果


[ Element a at 0x10ffaae18 ]


4. 获取 li 标签下的所有 span 标签


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

#result html.xpath( //li/span )

#注意这么写是不对的 

#因为 / 是用来获取子元素的 而 span 并不是 li 的子元素 所以 要用双斜杠

result html.xpath( //li//span )

print result


运行结果


[ Element span at 0x10d698e18 ]


5. 获取 li 标签下的 a 标签里的所有 class


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

result html.xpath( //li/a// class )

print result


运行结果


[ blod ]


6. 获取最后一个 li 的 a 的 href


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

result html.xpath( //li[last()]/a/ href )

# 谓语 [last()] 可以找到最后一个元素

print result


运行结果


[ link5.html ]


7. 获取倒数第二个元素的内容


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

result html.xpath( //li[last()-1]/a )

# text 方法可以获取元素内容

print result[0].text


运行结果


fourth item


8. 获取 class 值为 bold 的标签名


# xpath_li.py

from lxml import etree

html etree.parse( hello.html )

result html.xpath( //*[ class bold ] )

# tag方法可以获取标签名

print result[0].tag


运行结果


span



Python Xpath解析 数据提取 使用介绍&常用示例 Python Xpath解析 数据提取 使用介绍&常用示例 一、from lxml import etree 1.pip install lxml 2.xpath用法介绍 2.1 选取节点 2.1 路径表达式结合元素介绍 3.代码示例 4.Xpath Helper (免费 Chrome 插件)
Python 文档解析:lxml库的使用 lxml 是 Python 常用的文档解析库,能够高效地解析 HTML/XML 文档,常用于 Python 爬虫。lxml 为第三方库,需要我们通过pip命令安装。这个爬虫程序爬取了CSDN首页的所有.jpg、.jpeg、.png格式的图片,快来自己尝试一下吧!
Lansonli CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师