如何在Python中解析XML(10种方法 + 示例)

Expert Network Defense Engineer
解析XML是Python中的一项常见任务,无论你是在处理配置文件、网页抓取还是API。 本指南提供了10种不同的解决方案,包括代码示例、用例、比较表和常见问题解答。到最后,你将知道哪种方法最适合你的项目。
🔹 什么是XML解析?
XML(可扩展标记语言)广泛用于存储和传输数据。解析XML意味着读取XML结构并提取有用信息。在Python中,你可以通过多种方式实现这一点,从内置库到高级框架都有。
🔹 解决方案1:使用xml.etree.ElementTree
(标准库)
python
import xml.etree.ElementTree as ET
xml_data = '''<root><item>苹果</item><item>香蕉</item></root>'''
root = ET.fromstring(xml_data)
for child in root:
print(child.tag, child.text)
✅ 优点:内置,快速,没有依赖。
⚠️ 缺点:验证有限,对于复杂的XML较弱。
🔹 解决方案2:使用xml.dom.minidom
python
from xml.dom import minidom
doc = minidom.parseString('<root><item>苹果</item></root>')
items = doc.getElementsByTagName("item")
for item in items:
print(item.firstChild.data)
✅ 优点:美观的打印,易于使用。
⚠️ 缺点:对于大型XML占用内存较多。
🔹 解决方案3:使用lxml
python
from lxml import etree
xml_data = '''<root><item>苹果</item><item>香蕉</item></root>'''
root = etree.fromstring(xml_data)
for item in root.findall("item"):
print(item.text)
✅ 优点:非常快,支持XPath,提供验证。
⚠️ 缺点:需要安装(pip install lxml
)。
🔹 解决方案4:使用BeautifulSoup
python
from bs4 import BeautifulSoup
xml_data = """<root><item>苹果</item><item>香蕉</item></root>"""
soup = BeautifulSoup(xml_data, "xml")
for item in soup.find_all("item"):
print(item.text)
✅ 优点:适合初学者,灵活的解析。
⚠️ 缺点:比lxml
慢。
🔹 解决方案5:使用defusedxml
(安全解析)
python
from defusedxml.ElementTree import fromstring
xml_data = '<root><item>苹果</item></root>'
root = fromstring(xml_data)
for child in root:
print(child.text)
✅ 优点:防止XML漏洞(XXE,亿万笑)。
⚠️ 缺点:功能有限。
🔹 解决方案6:使用xmltodict
python
import xmltodict
xml_data = """<root><item>苹果</item><item>香蕉</item></root>"""
parsed = xmltodict.parse(xml_data)
print(parsed["root"]["item"])
✅ 优点:直接将XML转换为Python字典。
⚠️ 缺点:不适合处理大型XML的流式解析。
🔹 解决方案7:使用pandas
python
import pandas as pd
xml_data = """<root><row><name>约翰</name></row><row><name>简</name></row></root>"""
df = pd.read_xml(xml_data)
print(df)
✅ 优点:非常适合数据分析。
⚠️ 缺点:需要结构化的XML。
🔹 解决方案8:使用正则表达式(不推荐)
python
import re
xml_data = '<root><item>苹果</item><item>香蕉</item></root>'
items = re.findall(r'<item>(.*?)</item>', xml_data)
print(items)
✅ 优点:快速的技巧。
⚠️ 缺点:脆弱,对于嵌套/复杂的XML容易出错。
🔹 解决方案9:使用Scrapy(用于网络爬虫)
python
import scrapy
class XMLSpider(scrapy.Spider):
name = "xml_spider"
start_urls = ["https://example.com/data.xml"]
def parse(self, response):
for item in response.xpath("//item/text()").getall():
yield {"item": item}
✅ 优点:可扩展,非常适合抓取XML数据源。
⚠️ 缺点:对于简单解析来说,过于复杂。
🔹 解决方案10:使用Scrapeless API(最佳替代方案)
如果不想自己维护解析逻辑,可以使用Scrapeless Scraping Browser。 它自动:
- 处理动态内容
- 提取结构化数据(JSON、XML)
- 绕过反机器人保护
python
import requests
url = "https://api.scrapeless.com/xml-extract"
payload = {"url": "https://example.com/data.xml"}
response = requests.post(url, json=payload)
print(response.json())
✅ 优点:无需设置,稳健,可扩展。
⚠️ 缺点:付费服务。
🔹 比较表
方法 | 易用性 | 速度 | 安全性 | 最适合 |
---|---|---|---|---|
ElementTree | ⭐⭐⭐ | 快速 | ❌ | 简单XML |
minidom | ⭐⭐ | 中等 | ❌ | 美观打印 |
lxml | ⭐⭐⭐⭐ | 非常快 | ✅ | 复杂XML,XPath |
BeautifulSoup | ⭐⭐⭐ | 慢 | ❌ | 初学者 |
defusedxml | ⭐⭐ | 中等 | ✅ | 安全解析 |
xmltodict | ⭐⭐⭐⭐ | 快速 | ❌ | 字典转换 |
pandas | ⭐⭐⭐ | 中等 | ❌ | 数据分析 |
正则表达式 | ⭐ | 快速 | ❌ | 快速技巧 |
Scrapy | ⭐⭐⭐ | 中等 | ✅ | 爬取数据源 |
Scrapeless API | ⭐⭐⭐⭐ | 非常快 | ✅ | 企业级解析 |
🔹 真实场景
- 配置文件 →
ElementTree
- 大数据集 →
lxml
- API →
xmltodict
- 数据科学 →
pandas
- 安全应用 →
defusedxml
- 网络爬虫 →
Scrapy
或Scrapeless
🔹 常见问题
Q1: 在Python中解析XML的最快方法是什么?
👉 lxml
是最快的开源解决方案。Scrapeless API在生产级任务中更加快速。
Q2: 如何预防XML安全问题?
👉 使用 defusedxml
或 Scrapeless API,它们可以清理输入。
Q3: 我可以直接将XML转换为JSON吗?
👉 是的,xmltodict
或 Scrapeless API 可以做到这一点。
Q4: 哪种方法最适合网络爬虫?
👉 对于小项目使用Scrapy,对于企业需求使用Scrapeless。
🔹 参考文献
🔹 结论
Python 提供了多种解析XML的方式,从内置库如 ElementTree
到高级解决方案如 lxml
和 Scrapy
。如果您需要 可扩展、安全和免维护的解析,请考虑使用 无头Scrapeless抓取浏览器。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。