Python XML 解析

9 投票
2 回答
26794 浏览
提问于 2025-04-17 05:14

*注意:lxml在我的系统上无法运行。我希望找到一个不需要lxml的解决方案。

我已经看了一些相关的文档,但在让它按我想要的方式工作时遇到了困难。我想解析一个看起来像这样的XML文件:

<dict>
    <key>1375</key>
    <dict>
        <key>Key 1</key><integer>1375</integer>
        <key>Key 2</key><string>Some String</string>
        <key>Key 3</key><string>Another string</string>
        <key>Key 4</key><string>Yet another string</string>
        <key>Key 5</key><string>Strings anyone?</string>
    </dict>
</dict>

在我想要处理的文件中,还有更多类似的'dict'。我想遍历这个XML,并输出一个文本或数据文件,格式如下:

1375, "某个字符串", "另一个字符串", "再一个字符串", "有人要字符串吗?"

...

结束

** 最开始,我尝试使用lxml,但在我的系统上尝试了很多次都没成功,所以我转而使用DOM。最近,我又尝试用Etree来完成这个任务。请,出于所有美好的事物,能不能有人帮我一下?我对Python还比较陌生,想学习这个是怎么工作的。提前谢谢你们。

2 个回答

7

在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,某个代码块可能没有按预期工作,这时候我们就需要去查找原因。通常,我们会在网上搜索相关的问题,看看其他人是怎么解决的。

StackOverflow是一个很好的地方,很多程序员会在这里分享他们遇到的问题和解决方案。你可以在这个平台上提问,或者搜索别人已经问过的问题,找到你需要的答案。

记得在提问的时候,尽量把问题描述清楚,这样别人才能更好地帮助你。提供一些代码示例和错误信息会很有帮助。

总之,遇到问题不要怕,去问问别人,很多人都乐意分享他们的经验和知识。

import xml.etree.ElementTree as et
import csv

xmltext = """
<dicts>
    <key>1375</key>
    <dict>
        <key>Key 1</key><integer>1375</integer>
        <key>Key 2</key><string>Some String</string>
        <key>Key 3</key><string>Another string</string>
        <key>Key 4</key><string>Yet another string</string>
        <key>Key 5</key><string>Strings anyone?</string>
    </dict>
</dicts>
"""

f = open('output.txt', 'w')

writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC)

tree = et.fromstring(xmltext)

# iterate over the dict elements
for dict_el in tree.iterfind('dict'):
    data = []
    # get the text contents of each non-key element
    for el in dict_el:
        if el.tag == 'string':
            data.append(el.text)
        # if it's an integer element convert to int so csv wont quote it
        elif el.tag == 'integer':
            data.append(int(el.text))
    writer.writerow(data)
10

你可以使用 Python 自带的 xml.etree.ElementTree 这个库。它还有一个用 C 语言实现的版本,叫 xml.etree.cElementTree,这个版本运行得更快。还有一个叫 lxml.etree 的库,它功能更强大,但你现在的需求其实不需要用到它。

@Acorn 提供的代码在我这边(Python 2.7,Windows 7)也能正常工作,下面是我用的几种导入方式:

import xml.etree.ElementTree as et
import xml.etree.cElementTree as et
import lxml.etree as et
...
tree = et.fromstring(xmltext)
...

你用的是什么操作系统?在安装 lxml 的时候遇到了什么问题吗?

撰写回答