【问题标题】:Python XML Parsing [duplicate]Python XML解析[重复]
【发布时间】:2011-12-17 21:42:53
【问题描述】:

*注意: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 并输出一个如下所示的 text/dat 文件:

1375, "Some String", "Another String", "Yet another string", "Strings who?"

...

Eof

** 最初,我尝试使用 lxml,但经过多次尝试让它在我的系统上运行后,我转而使用 DOM。最近,我尝试使用 Etree 来完成这项任务。拜托,为了所有美好的事物,有人会帮助我吗?我对 Python 比较陌生,想了解它是如何工作的。提前谢谢你。

【问题讨论】:

  • 什么操作系统和 Python 版本?
  • 你有两次数字 1375。这可以是两个不同的数字吗?如果是这样,你想要哪个?

标签: python xml parsing lxml


【解决方案1】:

您可以使用 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 有什么安装问题?

【讨论】:

  • 我正在使用 Ubuntu Maverick Meerkat 上网本安装...最新的 lxml 安装尝试在我的终端中包含此消息:Unpacking python-lxml (from .../python-lxml_2.2.6-1_i386. deb) ... 设置固件-b43-installer (4.150.10.5-4) ... 不支持 PCI id 14e4:4315 的低功耗芯片!中止。
  • 我刚刚用代码尝试了新的导入并得到了这个错误: Traceback (last recent call last): File "/home/worky.py", line 5, in import lxml. etree as et ImportError: 没有名为 lxml.etree 的模块
  • (1)关于你的Ubuntu安装问题:建议你试试lxml邮件列表。 (2) "No module named lxml.etree" ...那是因为它没有安装。一次只激活一个导入;注释掉另外两个。
  • 好的,约翰,这对我有帮助,我现在正在搞乱代码......我也许可以用这段代码来摇摆它,虽然......这不完全是我需要的...如果我能让它工作,我猜这就是我需要的。感谢您的提示。
【解决方案2】:
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)

【讨论】:

  • 感谢您这么快发帖。问题是,我无法让 lxml 在我的机器上运行。我有 python 2.7 并多次尝试安装该模块,但都失败了。我希望有另一种不涉及 lxml 的方式。
  • 你运行的是什么操作系统?
  • 我正在运行 Ubuntu Maverick Meerkat 上网本版...
  • 你是如何安装它的?你试过用 PIP 安装它吗?
  • 好的,我现在正在安装pip,我会尝试弄清楚如何使用它来安装它。顺便说一句,纽约下雪了……哇?!并感谢您的帮助。
猜你喜欢
  • 2021-02-28
  • 2013-09-21
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多