Python操作XML和HTML,LXML类库的使用

时间:2022-07-04 00:54:42

LXML是Python中一个强大的XML和HTML处理库,它是基于libxml2和libxslt库构建的,并提供了一系列方便的API来处理XML和HTML文档。在本教程中,我们将学习如何使用LXML库来解析、操作和生成XML和HTML文档。

安装LXML库

在使用LXML库之前,我们需要先安装它。可以使用pip命令来安装:

pip install lxml

解析XML和HTML文档

LXML库提供了两种解析器,即ElementTree和SAX解析器。ElementTree解析器将整个XML/HTML文档解析成一个树形结构,而SAX解析器则是基于事件的解析器,逐个处理文档中的标记。

1、使用ElementTree解析器

我们可以使用ElementTree解析器来解析XML/HTML文档。首先,我们需要使用lxml.etree.parse()函数来读取XML/HTML文档并解析它。

from lxml import etree

# 读取XML文件并解析
tree = etree.parse("example.xml")

# 获取根元素
root = tree.getroot()

# 打印根元素的标签和属性
print("root tag:", root.tag)
print("root attributes:", root.attrib)

# 遍历树结构并打印标签和文本内容
for element in root.iter():
print("tag:", element.tag, "text:", element.text)

2、使用SAX解析器

我们可以使用lxml.sax模块中的saxparser来处理XML/HTML文档。首先,我们需要定义一个继承自lxml.sax.ContentHandler类的处理器类,然后使用lxml.sax.parse()函数来解析XML/HTML文档并将其传递给处理器类。

from lxml import etree, sax

# 定义处理器类
class MyHandler(sax.ContentHandler):
def __init__(self):
super().__init__()

def startElement(self, name, attrs):
print("start element:", name)
for attr in attrs.items():
print("attribute:", attr)

def endElement(self, name):
print("end element:", name)

def characters(self, content):
print("characters:", content)

# 解析XML文件
parser = sax.make_parser()
parser.setContentHandler(MyHandler())
parser.parse("example.xml")

操作XML和HTML文档

LXML库提供了一系列方便的API来操作XML和HTML文档。我们可以使用这些API来添加、删除、修改和查询文档中的元素和属性。

1、添加元素和属性

我们可以使用Element对象的append()方法来添加子元素,使用Element对象的set()方法来添加属性。

from lxml import etree

# 读取XML文件并解析
tree = etree.parse("example.xml")
root = tree.getroot()

# 添加子元素
new_element = etree.Element("new_element")
root.append(new_element)

# 添加属性
new_element.set("attr1", "value1")
new_element.set("attr2", "value2")

# 保存修改后的文档
tree.write("example.xml", encoding="utf-8")

2、删除元素和属性

我们可以使用Element对象的remove()方法来删除元素,使用Element对象的attrib.pop()方法来删除属性。

from lxml import etree

# 读取XML文件并解析
tree = etree.parse("example.xml")
root = tree.getroot()

# 查找要删除的元素
element_to_delete = root.find(".//element_to_delete")

# 删除元素
root.remove(element_to_delete)

# 删除属性
root.attrib.pop("attr_to_delete")

# 保存修改后的文档
tree.write("example.xml", encoding="utf-8")

3、修改元素和属性

我们可以使用Element对象的find()方法和Element对象的text属性来修改元素的文本内容,使用Element对象的set()方法来修改属性的值。

from lxml import etree

# 读取XML文件并解析
tree = etree.parse("example.xml")
root = tree.getroot()

# 查找要修改的元素
element_to_modify = root.find(".//element_to_modify")

# 修改元素文本内容
element_to_modify.text = "new text content"

# 修改属性值
element_to_modify.set("attr_to_modify", "new attribute value")

# 保存修改后的文档
tree.write("example.xml", encoding="utf-8")

4、查询元素和属性

我们可以使用Element对象的find()方法和Element对象的attrib属性来查询元素和属性。

from lxml import etree

# 读取XML文件并解析
tree = etree.parse("example.xml")
root = tree.getroot()

# 查询元素
element_to_find = root.find(".//element_to_find")

# 查询属性
attribute_to_find = root.attrib.get("attribute_to_find")

# 打印查询结果
print("element_to_find:", element_to_find)
print("attribute_to_find:", attribute_to_find)

生成XML和HTML文档

LXML库提供了ElementTree对象的tostring()方法来生成XML/HTML文档。

from lxml import etree

# 创建XML文档
root = etree.Element("root")
child1 = etree.SubElement(root, "child1")
child2 = etree.SubElement(root, "child2")
child1.text = "text content"
child2.set("attr1", "value1")
child2.set("attr2", "value2")

# 生成XML文档
xml_string = etree.tostring(root, pretty_print=True, encoding="utf-8")

# 保存XML文档
with open("example.xml", "wb") as f:
f.write(xml_string)

总结

本教程介绍了LXML库的基本使用方法,包括解析XML/HTML文档、操作XML/HTML文档和生成XML/HTML文档。LXML库还提供了很多其他功能,例如XPath表达式的高级用法、CSS选择器的支持、XML/HTML的序列化和反序列化等等。