lxml库如何使用
安装 lxml
lxml 是一个高性能的Python库,用于处理XML和HTML文件。可以通过 pip 安装:
pip install lxml
解析 HTML/XML
使用 lxml.etree
或 lxml.html
解析 HTML/XML 文档:
from lxml import etreehtml = "<html><body><p>Hello, lxml!</p></body></html>"
tree = etree.HTML(html)
print(etree.tostring(tree, pretty_print=True).decode())
XPath 查询
lxml 支持 XPath 查询语法,用于快速定位元素:
paragraphs = tree.xpath('//p/text()')
print(paragraphs) # 输出: ['Hello, lxml!']
修改文档
可以动态修改 XML/HTML 文档内容:
for p in tree.xpath('//p'):p.text = "Modified text"
print(etree.tostring(tree).decode())
处理命名空间
处理带有命名空间的 XML 文档:
xml = '<root xmlns:ns="http://example.com"><ns:child>Content</ns:child></root>'
tree = etree.fromstring(xml)
namespaces = {'ns': 'http://example.com'}
child = tree.xpath('//ns:child', namespaces=namespaces)[0]
print(child.text) # 输出: Content
解析大型文件
使用迭代解析处理大型 XML 文件,减少内存占用:
context = etree.iterparse('large_file.xml', events=('end',))
for event, elem in context:if elem.tag == 'target_tag':print(elem.text)elem.clear()
验证 XML
通过 DTD 或 XML Schema 验证 XML 文档:
schema = etree.XMLSchema(file='schema.xsd')
parser = etree.XMLParser(schema=schema)
valid_xml = etree.parse('document.xml', parser)
输出优化
格式化输出 XML/HTML,提高可读性:
print(etree.tostring(tree, pretty_print=True, encoding='unicode'))
处理 HTML 实体
解码 HTML 实体字符:
from lxml import html
text = html.fromstring("<div>").text_content()
print(text) # 输出: <div>
性能优化
对于高性能需求,禁用安全检查以提升速度:
parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse('file.xml', parser)
注意事项
- 处理不可信数据时启用安全措施,避免 XXE 攻击。
- 大型文档优先使用流式解析(
iterparse
)。 - XPath 表达式区分大小写,需与文档结构严格匹配。