Python如何用BeautifulSoup的xml解析器

12次阅读

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

Python如何用BeautifulSoup的xml解析器

Python中用BeautifulSoup解析XML,关键在于指定xml解析器(如lxml-xmlxml),否则默认按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 BeautifulSoup 

xml_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免费学习笔记(深入)”;

处理命名空间和自闭合标签

XML常见命名空间(如)和自闭合标签(如Python如何用BeautifulSoup的xml解析器)在"lxml-xml"下能正确保留:

  • 命名空间需在查找时声明前缀,例如soup.find("ns:tag", namespaces={"ns": "http://example.com/ns"})
  • 自闭合标签(如)不会被自动补全为,保持原样
  • 而用"html.parser""lxml"(非-xml)解析XML,会错误地当作HTML处理,破坏结构

验证是否真的在用XML模式

一个简单判断方式:打印soup.original_encoding或检查soup.selectself-closing标签的返回——若返回空或结构错乱,大概率没用对解析器。更直接的是看soup对象builder属性:

print(soup.builder.__class__.__name__) # 正常应输出:LXMLXMLTreeBuilder(用"lxml-xml"时) # 若输出 LXMLTreeBuilder,则是HTML模式,错了

text=ZqhQzanResources