BeautifulSoup 支持 XML 解析,但必须显式指定 lxml 或 xml 解析器;默认 html.parser 不适用。推荐 lxml,因其支持命名空间、XPath 和复杂结构;处理带命名空间 XML 需传入 namespaces 参数;注意编码和安装依赖。
可以,但需要正确配置解析器
,否则容易报错或解析不全。
BeautifulSoup 本身是解析器无关的库,它依赖底层解析器(如 lxml、xml、html.parser)来实际处理文档。默认的 html.parser 只能处理 HTML,无法正确解析 XML 文档(比如带命名空间、自闭合标签、严格语法的 XML)。要解析 XML,必须显式指定支持 XML 的解析器:
展开成 )以一段简单 RSS XML 为例:
My Feed Post One https://example.com/1
使用 lxml 解析:
from bs4 import BeautifulSoupwith open("feed.xml", "r", encoding="utf-8") as f: soup = BeautifulSoup(f, "xml") # 注意这里传入 "xml",等价于 "lxml-xml"
查找所有 item 标签
for item in soup.find_all("item"): title = item.find("title").get_text() link = item.find("link").get_text() print(title, link)
很多标准 XML(如 Atom、SOAP、SVG)使用命名空间,例如:。直接写 soup.find("link") 会找不到。
解决方法是用字典声明命名空间,并在查找时传入:
ns = {"atom": "http://www.w3.org/2005/Atom"}
feed_link = soup.find("atom:link", attrs={"rel": "self"}, namespaces=ns)
if feed_link:
href = feed_link.get("href")注意:namespaces 参数只在 lxml 解析器下生效;xml 解析器不支持命名空间查询。
lxml:pip install lxml(Windows 用户建议用 pip 安装预编译 wheel,避免编译失败)encoding="utf-8",或用 BeautifulSoup(xml_str, "xml", from_encoding="utf-8")
soup.find_all() 缓存结果,避免重复遍历lxml.etree.XMLSchema 或 xmlschema 库