Python XML 解析
*注意: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 个回答
在编程中,有时候我们会遇到一些问题,想要找到解决办法。比如说,某个代码块可能没有按预期工作,这时候我们就需要去查找原因。通常,我们会在网上搜索相关的问题,看看其他人是怎么解决的。
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)
你可以使用 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
的时候遇到了什么问题吗?