lxml库是干嘛的?Python lxml库用法 您所在的位置:网站首页 定位标签是干嘛的 lxml库是干嘛的?Python lxml库用法

lxml库是干嘛的?Python lxml库用法

2024-02-22 17:56| 来源: 网络整理| 查看: 265

IT培训班

lxml是使用Python语言编写的库,主要用于解析和提取HTML或者XML格式的数据,它不仅功能非常丰富,而且便于使用,可以利用XPath语法快速地定位特定的元素或节点。

lxml库中大部分功能都位于lxml.etree模块中,导入lxml.etree模块的常见方式如下:

from lxml import etree

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') print(etree.tostring(root)) # 输出结果如下 b''

此外,可以通过set()方法给已有的节点添加属性。在调用该方法时可以传入两个参数,其中第一个参数表示属性的名称,第二个参数表示属性的值。例如:

# 再次给root节点添加age属性 root.set('age', '30') print(etree.tostring(root)) # 输出结果如下 b''

在上述两个示例中,都用到了tostring()函数,该函数可以将元素序列化为XML树的编码字符串表示形式。

(3)节点内文本的操作:一般情况下,可以通过text、tail属性或者xpath()方法来访问文本内容。通过text属性访问节点的示例如下:

root=etree.Element('root')    # 创建root节点 root.text='Hello, World!'    # 给root节点添加文本 print(root.text) print(etree.tostring(root)) # 输出结果如下 Hello, world! b'Hello, World!'

2.从字符串或文件中解析XML

为了能够将XML文件解析为树结构,etree模块中提供了如下3个函数: (1 ) fromstring()函数:从字符串中解析XML文档或片段,返回根节点(或解析器目标返回的结果)。 (2) XML()函数:从字符串常量中解析XML文档或片段,返回根节点(或解析器目标返回的结果)。 (3) HTML()函数:从字符串常量中解析HTML文档或片段,返回根节点(或解析器目标返回的结果)。 其中,XML()函数的行为类似于fromstring0函数,通常用于将XML字面量直接写入到源代码中;HTML()函数可以自动补全缺少的和标签。以上3个函数的示例如下:

xml_data='data' # fromstring()方法 root_one=etree.fromstring(xml_data) print(root_one.tag) print(etree.tostring(root_one)) # XML方法,与fromstring方法基本一样 root_two=etree.XML(xml_data) print(root_two.tag) print(etree.tostring(root_two)) # HTML()方法,如果没有和标签,会自动补上 root_three=etree.HTML(xml_data) print(root_three.tag) print(etree.tostring(root_three)) 程序运行结果为: root b'data' root b'data' html b'data'

除了上述3个函数之外,还可以调用parse()函数从XML文件中直接解析。在调用函数时,如果没有提供解析器,则使用默认的解析器,函数会返回一个ElemenfTree 类的对象。例如:

html=etree.parse('./hello.html') result=etree.tostring(html, pretty_print=True)

ElementPath类简介

ElementTree类中附带了一个类似于XPath路径语言的ElementPath类。在ElementTree类或Elements类的API文档中,提供了3个常用的方法,可以满足大部分搜索和查询需求,并且这3个方法的参数都是XPath语句。具体如下: (1) find()方法:返回匹配到的第一 个子元素。 (2) findall()方法:以列表的形式返回所有匹配的子元素。 (3) iterfind()方法:返回一个所有匹配元素的迭代器。 从文档树的根节点开始,搜索符合要求的节点。例如:

# 从字符串中解析XML,返回根节点 root=etree.XML("aText") # 从根节点查找,返回匹配到的节点名称 print(root.find("a").tag) # 从根节点开始查找,返回匹配到的第一个节点的名称 print(root.findall(".//a[@x]")[0].tag)

程序运行结果为:

a A

还可以调用xpath()方法,使用元素作为上下文节点来评估XPath表达式。

lxml库的基本使用

这里使用一个HTML示例文件作为素材来介绍lxml库的基本应用。该文件名为hello.html,内容如下:

             first item         second item          third item         fourth item         fifth item     

按下来,基于上述HTML文档,使用lxml库中的路径表达式技巧,通过调用xpath()方法匹配选取的节点,具体如下:

获取任意位置的li节点 可以直接使用“//”从任意位置选取节点li,路径表达式如下:

//li

通过lxml.etree模块的xpath()方法,将hello.html文件中与该路径表达式匹配到的列表返回,并打印输出。具体代码如下:

from lxml import etree html=etree.parse('hello.html') # 查找所有的li节点 result=html.xpath('//li') # 打印标签的元素集合 print(result) # 打印标签的个数 print(len(result)) # 打印返回结果的类型 print(type(result)) # 打印第一个元素的类型 print(type(result[0]))

程序运行结果为:

[, , , , ] 5

继续获取标签的class属性

在上个表达式的末尾,使用“/”向下选取节点,并使用@选取class属性节点,表达式如下:

//1i/@class

获取标签的class属性的示例代码如下:

from lxml import etree html=etree.parse('hello.html') # 查找位于li标签的class属性 result=html.xpath('//li/@class') print(result)

程序运行结果为:

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

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

从任意位置开始选取倒数第二个标签,再向下选取标签。如果要获取该标签中的 文本,可以使用如下表达式:

//li[last()-1]/a

或者

//li[last()-1]/a]/text()

不同的是,第个表达式需要访问text属性,才能拿到标签的文本,而第二个表达式可直 接获取文本。使用第一 个路径表达式的示例如下:

from lxml import etree html=etree.parse('hello.html') # 获取倒数第二个元素的内容 result=html.xpath('//li[last()-1]/a') print(result[0].text)

程序运行结果:

fourth item



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有