2011-10-29 178 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