lxml使用Python语言编写的库,主要用于解析和提取HTML或者XML格式的数据,它不仅功能非常丰富,而且便于使用,可以利用XPath语法快速地定位特定的元素或节。
lxml库中部分功能都位于模块中,导入模块的常见如下:
fromlxmlimportetree
lxml库的一些相关类如下:
(1)Element类:可以理解为XML的节。
(2)ElementTree类:可以理解为一个完整的XML文档树。
(3)ElementPath类:可以理解为XPath,用于搜索和定位节。
1.Element类简介
Element类XML处理的核心类,可以直观地理解为XML的节,部分XML节的处理都围绕着Element类进行的。要想创建一个节对象,则可以通过构造函数直接创建。例如:
root=etree.Element('root')
上述示例中,参数root表示节的名称。关于Element类的相关操作,主要可分为三部分,分别节操作、节属性的操作、节内文本的操作,进行逐一介绍。(1)节操作:若要获取节的名称,可以通过tag属性获取。例如:
print(root.tag)
#输出结果如下
root
(2)节属性的操作:在创建节的同时,可以为节增加属性。节中的属性以key-value的形式进行存储的,类似于字典的存储。通过构造方法创建节时,可以在该方法中以参数的形式设置属性,其中参数的名称表示属性的名称,参数的值表示为属性的值。创建属性的示例如下:
#创建root节,并为其属性
root=etree.Element('root',interesting='totally')
string(root))
#输出结果如下
b'<rootinteresting="totally"/>'
此外,可以通过set()方法给已有的节属性。在调用该方法时可以传入两个参数,其中个参数表示属性的名称,第二个参数表示属性的值。例如:
#再次给root节age属性
root.set('age','30')
string(root))
#输出结果如下
b'<rootinteresting="totally"age="30"/>'
在上述两个示例中,都用到了tostring()函数,该函数可以将元素序列化为XML树的编码字符串表示形式。
(3)节内文本的操作:一般情况下,可以通过text、tail属性或者xpath()方法来访问文本内容。通过text属性访问节的示例如下:
root=etree.Element('root')#创建root节
='Hello,World!'#给root节文本
)
string(root))
#输出结果如下
Hello,world!
b'<root>Hello,World!</root>'
2.从字符串或文件中解析XML
为了能够将XML文件解析为树结构,etree模块中了如下3个函数:(1)fromstring()函数:从字符串中解析XML文档或片段,返回根节(或解析器目标返回的结果)。(2)XML()函数:从字符串常量中解析XML文档或片段,返回根节(或解析器目标返回的结果)。(3)HTML()函数:从字符串常量中解析HTML文档或片段,返回根节(或解析器目标返回的结果)。其中,XML()函数的行为类似于fromstring0函数,通常用于将XML字面量直接写入到源代码中;HTML()函数可以自动补全缺少的<html>和<body>标签。以上3个函数的示例如下:
xml_data='<root>data</root>'
#fromstring()方法
root_one=etree.fromstring(xml_data)
print(root_one.tag)
string(root_one))
#XML方法,与fromstring方法基本一样
root_two=etree.XML(xml_data)
print(root_two.tag)
string(root_two))
#HTML()方法,如果没有<html>和<body>标签,会自动补上
root_three=etree.HTML(xml_data)
print(root_three.tag)
string(root_three))
程序运行结果为:
root
b'<root>data</root>'
root
b'<root>data</root>'
html
b'<html><body><root>data</root></body></html>'
除了上述3个函数之外,还可以调用parse()函数从XML文件中直接解析。在调用函数时,如果没有解析器,则使用默认的解析器,函数会返回一个ElemenfTree类的对象。例如:
html=etree.parse('./hello.html')
string(html,pretty_print=True)
ElementPath类简介
ElementTree类中附带了一个类似于XPath路径语言的ElementPath类。在ElementTree类或Elements类的API文档中,了3个常用的方法,可以满足部分搜索和查询需求,并且这3
个方法的参数都XPath语句。具体如下:(1)find()方法:返回匹配到的个子元素。(2)findall()方法:以列表的形式返回所有匹配的子元素。(3)iterfind()方法:返回一个所有匹配元素的迭代器。从文档树的根节始,搜索符合要求的节。例如:
#从字符串中解析XML,返回根节
root=etree.XML("<root><ax='123'>aText<b/><c/><b/></a></root>")
#从根节查,返回匹配到的节名称
print(root.find("a").tag)
#从根节始查,返回匹配到的个节的名称
print(root.findall(".//a[@x]")[0].tag)
程序运行结果为:
a
A
还可以调用xpath()方法,使用元素作为上下文节来评估XPath表达式。
lxml库的基本使用
这里使用一个HTML示例文件作为素材来介绍lxml库的基本应用。该文件名为hello.html,内容如下:
<div>
<ul>
<liclass="item-0"><ahref="link1.html">firstitem</a></li>
<liclass="item-1"><ahref="link2.html">seconditem</a></li>
<liclass="item-inactive"><ahref="link3.html"><spanclass="bold">thirditem</span></a></li>
<liclass="item-1"><ahref="link4.html">fourthitem</a></li>
<liclass="item-0"><ahref="link5.html">fifthitem</a></li>
</ul>
</div>
按下来,基于上述HTML文档,使用lxml库中的路径表达式技巧,通过调用xpath()方法匹配选取的节,具体如下:
获取任意位置的li节可以直接使用“//”从任意位置选取节li,路径表达式如下:
//li
通过模块的xpath()方法,将hello.html文件中与该路径表达式匹配到的列表返回,并打印输出。具体代码如下:
fromlxmlimportetree
html=etree.parse('hello.html')
#查所有的li节
result=html.xpath('//li')
#打印<li>标签的元素集合
print(result)
#打印<li>标签的个数
print(len(result))
#打印返回结果的类型
print(type(result))
#打印个元素的类型
print(type(result[0]))
程序运行结果为:
[<Elementliat0x2cc9a48>,<Elementliat0x2cc99c8>,<Elementliat0x2cc9a88>,<Elementliat0x2cc9ac8>,<Elementliat0x2cc9b08>]
5
<class'list'>
<_Element'>
继续获取<li>标签的class属性
在上个表达式的末尾,使用“/”向下选取节,并使用@选取class属性节,表达式如下:
//1i/@class
获取<li>标签的class属性的示例代码如下:
fromlxmlimportetree
html=etree.parse('hello.html')
#查位于li标签的class属性
result=html.xpath('//li/@class')
print(result)
程序运行结果为:
['item-0','item-1','item-inactive','item-1','item-0']
python处理xml文件获取倒数第二个元素的内容
从任意位置始选取倒数第二个<li>标签,再向下选取标签<a>。如果要获取该标签中的文本,可以使用如下表达式:
//li[last()-1]/a
或者
//li[last()-1]/a]/text()
不同的,第个表达式需要访问text属性,才能拿到标签的文本,而第二个表达式可直接获取文本。使用个路径表达式的示例如下:
fromlxmlimportetree
html=etree.parse('hello.html')
#获取倒数第二个元素的内容
result=html.xpath('//li[last()-1]/a')

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。