Python中用BeautifulSoup解析XML必须指定"lxml-xml"或"xml"解析器,否则按HTML处理会导致命名空间、自闭合标签等异常;推荐安装lxml并使用"lxml-xml"以支持XPath和严格XML语法。

Python中用BeautifulSoup解析XML,关键在于指定xml解析器(如lxml-xml或xml),否则默认按HTML处理,会导致标签闭合、命名空间、自闭合标签等行为异常。
安装并选择正确的XML解析器
BeautifulSoup本身不自带XML解析能力,需搭配外部解析器:
-
推荐
lxml:功能完整、支持XPath、命名空间和严格XML语法,安装命令:pip install lxml;使用时指定"lxml-xml"(注意带-xml后缀) -
xml(内置xml.etree.ElementTree):无需额外安装,但功能较弱,不支持XPath和部分命名空间特性,指定为"xml"
基础用法:加载XML并查找元素
与HTML用法类似,但解析器名必须明确写为"lxml-xml"或"xml":
from bs4 import BeautifulSoupxml_data = """
""" Apple Banana soup = BeautifulSoup(xml_data, "lxml-xml") # ← 关键:用"lxml-xml" items = soup.find_all("item") for item in items: print(item["id"], item.name.get_text())
输出:1 Apple 2 Banana
立即学习“Python免费学习笔记(深入)”;
Python v2.4版chm格式的中文手册,内容丰富全面,不但是一本手册,你完全可以把她作为一本Python的入门教程,教你如何使用Python解释器、流程控制、数据结构、模板、输入和输出、错误和异常、类和标准库详解等方面的知识技巧。同时后附的手册可以方便你的查询。
处理命名空间和自闭合标签
XML常见命名空间(如)和自闭合标签(如)在"lxml-xml"下能正确保留:
- 命名空间需在查找时声明前缀,例如
soup.find("ns:tag", namespaces={"ns": "http://example.com/ns"}) - 自闭合标签(如
)不会被自动补全为,保持原样 - 而用
"html.parser"或"lxml"(非-xml)解析XML,会错误地当作HTML处理,破坏结构
验证是否真的在用XML模式
一个简单判断方式:打印soup.original_encoding或检查soup.select对self-closing标签的返回——若返回空或结构错乱,大概率没用对解析器。更直接的是看soup对象的builder属性:
print(soup.builder.__class__.__name__) # 正常应输出:LXMLXMLTreeBuilder(用"lxml-xml"时) # 若输出 LXMLTreeBuilder,则是HTML模式,错了









