python如何解析xml?lxml库介绍!

2021-07-13 10:36:54 浏览数 (5)

在学习了python如何解析xml后,很多小伙伴可能会有这样的感受——这学的是啥,怎么那么复杂?没错,内置的python标准库向来都是差强人意(实际上python内置库已经做得很好了,只不过第三方的库做得更好,相比之下就觉得内置库不香了)。xml的内置标准库其实并不是最好的xml解析工具,还有有一个解析xml更加强大的库,它就是lxml。

介绍

lxml库是一个python的xml解析库,它支持HTML和xml的解析,并且支持Xpath解析方式。相比于原生的xml解析而言,lxml的接下效率相当高。

Xpath是一门在xml文档中查找信息的语言,虽然它最早是用来搜寻XML文档的,但它也可以用于查找html语言。它的选择功能十分强大,提供了非常简单明了的路径选择表达式,另外他还提供了超过100个内建函数用于数据处理。关于Xpath的学习和更多了解,可以前往Xpath教程

安装

使用pip进行安装即可,对应的pip命令如下:

pip install lxml

使用

一、读取文本解析节点

from lxml import etree

text='''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">第一个</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-0"><a href="link5.html">a属性</a>
     </ul>
 </div>
'''
html=etree.HTML(text) #初始化生成一个XPath解析对象
result=etree.tostring(html,encoding='utf-8')   #解析对象输出代码
print(type(html))
print(type(result))
print(result.decode('utf-8'))

 etree会修复缺少的HTML文本节点,所以打印结果是有补全html标签的。

二、读取HTML文件进行解析

from lxml import etree

html=etree.parse('test.html',etree.HTMLParser()) #指定解析器HTMLParser会根据文件修复HTML文件中缺失的如声明信息
result=etree.tostring(html)   #解析成字节
#result=etree.tostringlist(html) #解析成列表
print(type(html))
print(type(result))
print(result)

三、获取所有节点

from lxml import etree

html=etree.parse('test',etree.HTMLParser())
result=html.xpath('//*')  #//代表获取子孙节点,*代表获取所有

print(type(html))
print(type(result))
print(result)

 返回一个列表,每个元素都是Element类型,所有的节点都包含在其中。

如需获取li节点,可以在//后面加上节点名称,然后调用Xpath方法。

四、文本获取

from lxml import etree

text='''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">第一个</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
     </ul>
 </div>
'''

html=etree.HTML(text,etree.HTMLParser())
result=html.xpath('//li[@class="item-1"]/a/text()') #获取a节点下的内容
result1=html.xpath('//li[@class="item-1"]//text()') #获取li下所有子孙节点的内容

print(result)
print(result1)

 通过Xpath的text()方法,我们可以获取节点中的文本。

五、属性获取

通过@符号即可获取节点的属性,比如下面代码的获取a标签的href属性:

result=html.xpath('//li/a/@href')  #获取a的href属性
result=html.xpath('//li//@href')   #获取所有li子孙节点的href属性

六、按序选择

我们进行选择的时候有时候会匹配多个节点,但我们只需要其中的一个,这时候我们就可以通过引入索引的方法(中括号内加索引值)获取特定次序的节点:


from lxml import etree

text1='''
<div>
    <ul>
         <li class="aaa" name="item"><a href="link1.html">第一个</a></li>
         <li class="aaa" name="item"><a href="link1.html">第二个</a></li>
         <li class="aaa" name="item"><a href="link1.html">第三个</a></li>
         <li class="aaa" name="item"><a href="link1.html">第四个</a></li> 
     </ul>
 </div>
'''

html=etree.HTML(text1,etree.HTMLParser())

result=html.xpath('//li[contains(@class,"aaa")]/a/text()') #获取所有li节点下a节点的内容
result1=html.xpath('//li[1][contains(@class,"aaa")]/a/text()') #获取第一个
result2=html.xpath('//li[last()][contains(@class,"aaa")]/a/text()') #获取最后一个
result3=html.xpath('//li[position()>2 and position()<4][contains(@class,"aaa")]/a/text()') #获取定位值大于3且小于4的节点(也就是获取第三个)
result4=html.xpath('//li[last()-2][contains(@class,"aaa")]/a/text()') #获取倒数第三个


print(result)
print(result1)
print(result2)
print(result3)
print(result4)

小结

对于lxml库而言,上面的功能其实只是一小部分,但是却是比较常用的部分。凭心而论,Xpath的定位方式虽然看起来很复杂,但实际使用上比DOM的各种getelement方法好用得多,而且现代浏览器很多都支持生成Xpath路径,更加方便了我们的使用。

以上就是关于lxml库的全部介绍,更多python学习内容请关注菜鸟自学python编程


0 人点赞