如何用 Python 解析 XML

评论: 0

XML(可扩展标记语言)是一种通用标记语言,常用于将文档编码为人类可读和机器可读的格式。这种格式被广泛用于传输数据、创建配置文件和开发网络服务。

在 XML 文档中,元素被封装在标记中,标记表示每个元素的开始和结束,为数据提供了清晰的结构。

XML 示例:

<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
      </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>

本文探讨了可用来在 Python 中解析 XML 的不同库和方法。

用于 XML 解析的 Python 库

接下来,我们将深入探讨可用于在 Python 中提取 XML 数据的各种库,并指导您完成安装过程,为处理 XML 文档设置环境。

xml.etree.ElementTree

xml.etree.ElementTree 是一个用于解析和创建 XML 数据的标准库模块。它为从字符串和文件中解析 XML 以及创建 XML 文档提供了高效、简单的 API。

基本示例:


import xml.etree.ElementTree as ET

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = ET.fromstring(xml_data)

for item in root.findall('item'):
    name = item.find('name').text
    price = item.find('price').text
    print(f'Name: {name}, Price: {price}')

输出:

1.png

xml.dom.minidom

xml.dom.minidom 是另一个内置的 Python 库,它提供了 XML 的 DOM(文档对象模型)表示法。通过该库可以对 XML 进行更详细的操作。

基本示例:

from xml.dom.minidom import parseString

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

dom = parseString(xml_data)
items = dom.getElementsByTagName('item')

for item in items:
    name = item.getElementsByTagName('name')[0].firstChild.data
    price = item.getElementsByTagName('price')[0].firstChild.data
    print(f'Name: {name}, Price: {price}')

输出:

2.png

BeautifulSoup XML parsing

BeautifulSoup 是一个用于解析 HTML 和 XML 文档的流行库。它尤其适用于扫描网络数据和处理格式不佳的 XML。

基本示例:


from bs4 import BeautifulSoup

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

soup = BeautifulSoup(xml_data, 'xml')
items = soup.find_all('item')

for item in items:
    name = item.find('name').text
    price = item.find('price').text
    print(f'Name: {name}, Price: {price}')

输出:

3.png

lxml library

lxml 是一个功能强大的库,它将 ElementTree 的易用性与 libxml2 库的速度和功能相结合。它同时支持 XML 和 HTML 解析。

基本示例:

from lxml import etree

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = etree.fromstring(xml_data)
items = root.findall('item')

for item in items:
    name = item.find('name').text
    price = item.find('price').text
    print(f'Name: {name}, Price: {price}')

输出:

4.png

XML 到字典的转换

将 XML 转换为字典有助于更灵活地操作和处理 XML 数据。


import xml.etree.ElementTree as ET

def xml_to_dict(element):
    if len(element) == 0:
        return element.text
    return {child.tag: xml_to_dict(child) for child in element}

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = ET.fromstring(xml_data)
data_dict = xml_to_dict(root)
print(data_dict)

输出:

5.png

将 XML 转换为 CSV

将数据从 XML 转换为 CSV 格式可简化分析和存储数据的过程,使其更容易与电子表格应用程序集成,并增强有效可视化数据的能力。

import csv
import xml.etree.ElementTree as ET

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

root = ET.fromstring(xml_data)

with open('output.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(['Name', 'Price'])
    
    for item in root.findall('item'):
        name = item.find('name').text
        price = item.find('price').text
        writer.writerow([name, price])

处理 XML 错误

在解析 XML 时,处理错误对于确保代码能从容应对意外或畸形数据至关重要。

import xml.etree.ElementTree as ET

xml_data = """
<data>
    <item>
        <name>Item 1</name>
        <price>10</price>
    </item>
    <item>
        <name>Item 2</name>
        <price>20</price>
    </item>
</data>
"""

try:
    root = ET.fromstring(xml_data)
except ET.ParseError as e:
    print(f'Error parsing XML: {e}')

从 URL 解析 XML

下面是一个使用 BeautifulSoup 从 URL 解析 XML 数据的实用示例:

import requests  # 导入请求库以发出 HTTP 请求
from bs4 import BeautifulSoup  #从 bs4 库导入 BeautifulSoup,用于解析 XML

# 定义 XML 数据的 URL
url = "https://httpbin.org/xml"

# 向 URL 发送 GET 请求
response = requests.get(url)

# 使用 BeautifulSoup 解析响应的 XML 内容
soup = BeautifulSoup(response.content, 'xml')

# 循环浏览 XML 中的所有 "幻灯片 "元素
for slide in soup.find_all('slide'):
    # 查找每个 "幻灯片 "中的 "标题 "元素并获取其文本
    title = slide.find('title').text
    # 打印标题文本
    print(f'Title: {title}')

输出:

6 (1).png

从网络服务到配置文件,各种应用程序都使用 XML 基本数据格式。Python 拥有大量强大的库,可用于 XML 数据解析和操作。无论是基本的数据挖掘还是复杂的文档处理,Python 都有一个全面的 XML 数据解析库。Python 网络开发人员的必备能力是为数据交换和网络搜索编写 XML 代码。

评论:

0 评论