2011-10-29 131 views
8

*注意:lxml不会在我的系统上运行。我希望找到一个不涉及lxml的解决方案。Python XML解析

我已经经历过这里的一些文档,并且难以得到这个工作,我想怎么做。我想解析,看起来像这样一些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> 

在我试图操纵文件,有更多的“字典”遵循这一个。我想通读XML并输出一个如下所示的文本/数据文件:

1375,“Some String”,“Another String”,“Another another string”,“Strings anyone?”

...

EOF

** 本来,我试图用lxml的,但经过多次尝试得到它的工作我的系统上,我提出使用DOM。最近,我尝试使用Etree来完成这项任务。请为了一切美好的爱情,有人会帮助我一起吗?我对Python比较陌生,想了解它是如何工作的。我提前谢谢你。

+1

什么操作系统和Python的版本? – Acorn

+0

你有两个号码1375。这可以是两个不同的数字吗?如果是这样,你想要哪个? –

回答

10

您可以使用Python附带的xml.etree.ElementTree。有一个包括伴侣C实施(即更快)xml.etree.cElementTreelxml.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

+0

我正在使用Ubuntu Maverick Meerkat上网本安装...最新的lxml安装尝试在我的终端中包含此消息:解包python-lxml(从.../python-lxml_2 .2.6-1_i386.deb)... 设置firmware-b43-installer(4.150.10.5-4)... 不支持PCI id为14e4:4315的低功耗芯片! 正在中止。 – PleaseHelpTheNewGuy

+0

我刚刚尝试新的导入代码并得到此错误:Traceback(最近调用最后一次): 文件“/home/worky.py”,第5行,在 import lxml.etree as等 ImportError:No模块名为lxml.etree – PleaseHelpTheNewGuy

+0

(1)关于您的Ubuntu安装问题:我建议您尝试lxml邮件列表。 (2)“没有名为lxml.etree的模块”...这是因为它没有安装。一次只有一个导入活动;注释掉其他两个。 –

7
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) 
+0

感谢您发布这么快。问题是,我无法让lxml在我的机器上运行。我有python 2.7,并且已经做了几次尝试来安装这个模块,但都失败了。我希望有另一种不涉及lxml的方式。 – PleaseHelpTheNewGuy

+1

你在运行什么操作系统? – Acorn

+0

我正在运行Ubuntu Maverick Meerkat上网本版... – PleaseHelpTheNewGuy