2011-10-29 10 views
8

* Uwaga: lxml nie będzie działał w moim systemie. Miałem nadzieję znaleźć rozwiązanie, które nie zawiera lxml.Python XML Parsing

Przeszedłem już przez część dokumentacji tutaj i mam problemy z jej uruchomieniem w taki sposób, w jaki chciałbym. Chciałbym analizować jakiś plik XML, który wygląda tak:

<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> 

w pliku Próbuję manipulować, są bardziej „dict”, że po tej jednej. Chciałbym odczytać XML i wypisać plik tekst/dat, który wyglądałby tak:

1375, "Some String", "Another String", "Jeszcze inny ciąg", "Ciągi kogoś?"

...

EOF

** Pierwotnie, starałem się używać lxml, ale po wielu próbach aby dostać pracy w moim systemie, przeniosłem się do korzystania DOM. Niedawno próbowałem użyć Etree, aby wykonać to zadanie. Proszę, z miłości do wszystkiego, co jest dobre, czy ktoś mi pomoże z tym? Jestem stosunkowo nowy w Pythonie i chciałbym się dowiedzieć, jak to działa. Z góry dziękuję.

+1

Jaki system operacyjny i wersja Pythona? – Acorn

+0

Masz numer 1375 dwa razy. Czy to mogą być dwie różne liczby? Jeśli tak, czego chcesz? –

Odpowiedz

10

Możesz użyć xml.etree.ElementTree, który jest dołączony do Pythona. Dostępny jest dołączony towarzysz C (tj. Znacznie szybszy) xml.etree.cElementTree. lxml.etree oferuje zestaw funkcji, ale nie jest potrzebny do tego, co chcesz zrobić.

kodu podanego przez @Acorn działa identycznie dla mnie (Python 2.7, Windows 7) z każdego z następujących importu:

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

Co OS używasz i co instalacja problemy miałeś z lxml?

+0

Używam instalacji Ubuntu Maverick Meerkat Netbook ... ostatnia próba instalacji lxml zawierała ten komunikat w moim terminalu: Rozpakowywanie python-lxml (z .../python-lxml_2 .2.6-1_i386.deb) ... Konfigurowanie oprogramowania układowego-b43-installer (4.150.10.5-4) ... Nieobsługiwany układ o niskiej mocy z identyfikatorem PCI 14e4: 4315! Przerwanie. – PleaseHelpTheNewGuy

+0

Właśnie próbowałem nowego importu z kodem i otrzymałem ten błąd: Traceback (ostatnie ostatnie połączenie): Plik "/home/worky.py", wiersz 5, w import lxml.etree jako et ImportError: Nie moduł o nazwie lxml.etree – PleaseHelpTheNewGuy

+0

(1) O twoim problemie z instalacją Ubuntu: Sugeruję wypróbowanie listy mailingowej lxml. (2) "Brak modułu o nazwie lxml.etree" ... ponieważ nie jest zainstalowany. Czy aktywny jest tylko jeden import na raz; skomentuj pozostałe dwie. –

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

Dzięki za wysyłkę tak szybko. Problem polega na tym, że nie mogę uruchomić lxml na moim komputerze. Mam python 2.7 i poczyniłem kilka prób, aby ten moduł został zainstalowany, ale się nie udało. Miałem nadzieję, że istnieje inny sposób, który nie obejmuje lxml. – PleaseHelpTheNewGuy

+1

Jaki system operacyjny jest uruchomiony? – Acorn

+0

Używam wersji Ubuntu Maverick Meerkat Netbook ... – PleaseHelpTheNewGuy