2011-10-29 27 views
8

* Nota: lxml no se ejecutará en mi sistema. Esperaba encontrar una solución que no implique lxml.Python XML Parsing

Ya he revisado algunos de los documentos aquí, y tengo dificultades para hacer que esto funcione, me gustaría. Me gustaría analizar algún archivo XML que tiene este aspecto:

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

En el archivo que estoy tratando de manipular, hay más 'dict' que siguen a éste. Me gustaría leer el XML y generar un archivo text/dat que se vería así:

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

...

Eof

** Originalmente, He intentado utilizar lxml, pero después de muchos intentos para conseguir que funcione en mi sistema, pasé a usar DOM. Más recientemente, intenté usar Etree para hacer esta tarea. Por favor, por el amor de todo lo que es bueno, ¿alguien me ayudaría con esto? Soy relativamente nuevo en Python y me gustaría aprender cómo funciona esto. Os doy las gracias de antemano.

+1

¿Qué sistema operativo y versión de Python? – Acorn

+0

Tiene el número 1375 dos veces. ¿Pueden ser dos números diferentes? Si es así, ¿cuál quieres? –

Respuesta

10

Puede usar xml.etree.ElementTree que se incluye con Python. Hay un acompañante incluido C implementado (es decir, mucho más rápido) xml.etree.cElementTree. lxml.etree ofrece un superconjunto de la funcionalidad, pero no es necesario para lo que desea hacer.

El código proporcionado por @Acorn funciona de forma idéntica para mí (Python 2.7, Windows 7) con cada una de las siguientes importaciones:

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

Lo que os problemas de instalación y lo que ha tenido con lxml?

+0

Estoy usando la instalación de Ubuntu Maverick Meerkat Netbook ... el último intento de instalación de lxml incluyó este mensaje en mi terminal: Desempaquetando python-lxml (from .../python-lxml_2 .2.6-1_i386.deb) ... Configuración del firmware-b43-installer (4.150.10.5-4) ... Chip de baja potencia no soportado con PCI id 14e4: 4315! Aborto. – PleaseHelpTheNewGuy

+0

Acabo de probar las nuevas importaciones con el código y obtuve este error: Traza (última llamada más reciente): Archivo "/home/worky.py", línea 5, en importe lxml.etree como et ImportError: No módulo llamado lxml.etree – PleaseHelpTheNewGuy

+0

(1) Acerca de su problema de instalación de Ubuntu: le sugiero que pruebe la lista de correo lxml. (2) "Ningún módulo llamado lxml.etree" ... eso es porque no está instalado. Tener solo una importación activa a la vez; comentar los otros dos. –

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

Gracias por publicar tan pronto. El problema es que no puedo ejecutar lxml en mi máquina. Tengo Python 2.7 y he intentado varios intentos para instalar ese módulo, pero he fallado. Esperaba que hubiera otra forma que no implique lxml. – PleaseHelpTheNewGuy

+1

¿Qué sistema operativo está ejecutando? – Acorn

+0

Estoy ejecutando Ubuntu Maverick Meerkat Netbook edition ... – PleaseHelpTheNewGuy