python lxml module

简介

lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。

XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。

XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择

XPath于1999年11月16日成为W3C标准,它被设计为供XSLT、XPointer以及其他XML解析软件使用,更多的文档可以访问其官方网站:https://www.w3.org/TR/xpath/

安装

windows系统下的安装

  • pip安装

    1
    pip3 install lxml
  • wheel安装

1
2
3
pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl

# 下载对应系统版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

linux下安装

1
2
yum install -y epel-release libxslt-devel libxml2-devel openssl-devel
pip3 install lxml

用法

XPath常用规则

1
2
3
4
5
6
7
8
9
10
11
12
13
表达式	                描述
nodename 选取此节点的所有子节点
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性
* 通配符,选择所有元素节点与元素名
@* 选取所有属性
[@attrib] 选取具有给定属性的所有元素
[@attrib='value'] 选取给定属性具有给定值的所有元素
[tag] 选取所有具有指定元素的直接子节点
[tag='text'] 选取所有具有指定元素并且文本内容是text节点

读取文本解析节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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(result.decode('utf-8'))

# print
<html><body><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>
</li></ul>
</div>
</body></html>

读取HTML文件进行解析

1
2
3
4
5
6
7
from lxml import etree

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

获取所有节点

1
2
3
4
from lxml import etree

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

获取子节点

1
2
3
4
from lxml import etree

html = etree.parse('test',etree.HTMLParser())
result = html.xpath('//li/a')

获取父节点

1
2
3
4
5
from lxml import etree

html = etree.parse('test',etree.HTMLParser())
result = html.xpath('//a[@href="link2.html"]/../@class')
result1 = html.xpath('//a[@href="link2.html"]/parent::*/@class')

属性匹配

1
2
3
4
from lxml import etree

html = etree.parse('test',etree.HTMLParser())
result=html.xpath('//li[@class="item-1"]')

文本获取

1
2
3
4
5
from lxml import etree

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下所有子孙节点的内容

属性获取

1
2
3
4
5
from lxml import etree

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

参考

https://www.cnblogs.com/zhangxinqi/p/9210211.html

-------------本文结束感谢您的阅读-------------