2010-12-15 8 views
6

He buscado algunos tutoriales/otras preguntas en la pila/documentación y todavía no lo puedo descifrar. ugh !!!Python (novato) Parse XML desde la llamada de la API

Realizando la solicitud API y el análisis sintáctico (quiero asignar variables pero eso es una ventaja para esta pregunta), esto es lo que intento. ¿Por qué no puedo enumerar el título y el enlace de los artículos?

#!/usr/bin/python 

# Screen Scraper for Subs 
import urllib 
from xml.etree import ElementTree as ET 

show = 'heroes' 
season = '4' 
language = 'en' 
limit = '1' 

requestURL = 'http://api.allsubs.org/index.php?' \ 
      + 'search=' + show \ 
      + '+season+' + season \ 
      + '&language=' + language \ 
      + '&limit=' + limit 

root = ET.parse(urllib.urlopen(requestURL)).getroot() 
print root 
print '\n' 

items = root.findall('items') 
for item in items: 
    item.find('title').text # should print: <![CDATA[Heroes Season 4 Subtitles]]> 
    item.find('link').text # Should print: http://www.allsubs.org/subs-download/heroes+season+4/1223435/ 

respuesta XML

 <AllSubsAPI> 
     <title>AllSubs API: Subtitles Search</title> 
     <link>http://www.allsubs.org</link> 
     <description><![CDATA[Subtitles Search for Heroes Season 4]]></description> 
     <language>en-us</language> 
     <results>1</results> 
     <found_results>24</found_results> 
<items> 
    <item> 
      <title><![CDATA[Heroes Season 4 Subtitles]]></title> 
      <link>http://www.allsubs.org/subs-download/heroes+season+4/1223435/</link> 
      <filename>heroes-season-4-english-heroes-season-4-en.zip</filename> 
      <files_in_archive>Heroes - 4x01-02 - Orientation.HDTV.FQM.en.srt|Heroes - 4x17 - The Art of Deception.HDTV.2HD.en.srt|Heroes - 4x07 - Strange Attractors.HDTV.LOL.en.srt|Heroes - 4x08 - Once Upon a Time in Texas.HDTV.2HD.en.srt|Heroes - 4x07 - Strange Attractors.720p HDTV.DIMENSION.en.srt|Heroes - 4x05 - Hysterical Blindness.720p HDTV.X264.en.srt|Heroes - 4x09 - Shadowboxing.HDTV.LOL.en.srt|Heroes - 4x16 - Pass Fail.HDTV.LOL.en.srt|Heroes - 4x04 - Acceptance.HDTV.en.srt|Heroes - 4x01-02 - Orientation.720p HDTV.DIMENSION.en.srt|Heroes - 4x06 - Tabula Rasa.HDTV.NoTV.en.srt|Heroes - 4x10 - Brother's Keeper.HDTV.FQM.en.srt|Heroes - 4x04 - Acceptance.HDTV.FQM.en.srt|Heroes - 4x14 - Let It Bleed.720p HDTV.DIMENSION.en.srt|Heroes - 4x06 - Tabula Rasa.720p HDTV.SiTV.en.srt|Heroes - 4x08 - Once Upon a Time in Texas.HDTV.NoTV.en.srt|Heroes - 4x12 - The Fifth Stage.HDTV.LOL.en.srt|Heroes - 4x19 - Brave New World.HDTV.LOL.en.srt|Heroes - 4x15 - Close to You.720p HDTV.DIMENSION.en.srt|Heroes - 4x03 - Ink.720p HDTV.DIMENSION.en.srt|Heroes - 4x11 - Thanksgiving.720p HDTV.DIMENSION.en.srt|Heroes - 4x13 - Upon This Rock.720p HDTV.DIMENSION.en.srt|Heroes - 4x13 - Upon This Rock.HDTV.LOL.en.srt|Heroes - 4x14 - Let It Bleed.HDTV.LOL.en.srt|Heroes - 4x15 - Close to You.HDTV.LOL.en.srt|Heroes - 4x12 - The Fifth Stage.720p HDTV.DIMENSION.en.srt|Heroes - 4x18 - The Wall.HDTV.LOL.en.srt|Heroes - 4x08 - Once Upon a Time in Texas.720p HDTV.CTU.en.srt|Heroes - 4x17 - The Art of Deception.HDTV.CTU.en.srt|Heroes - 4x09 - Shadowboxing.720p HDTV.DIMENSION.en.srt|Heroes - 4x10 - Brother's Keeper.720p HDTV.DIMENSION.en.srt|Heroes - 4x04 - Acceptance.720p HDTV.CTU.en.srt|Heroes - 4x11 - Thanksgiving.HDTV.FQM.en.srt|Heroes - 4x03 - Ink.HDTV.FQM.en.srt|Heroes - 4x05 - Hysterical Blindness.HDTV.XII.en.srt|</files_in_archive> 
      <languages>en</languages> 
      <added_on>2010-02-16</added_on> 
    </item> 

</items> 
</AllSubsAPI> 

ACTUALIZACIÓN:

Esto funcionó, gracias por la ayuda y señalando mi error tipográfico

items = root.findall('items/item') 
for item in items: 
    print item.find('title').text 
    print item.find('link').text 
+1

http://api.allsubs.org/index.php?search=heros+season+4&language=en&limit=1 es el requestURL, y obtengo sin resultados - I cree que no está entendiendo bien ... – Spacedman

+1

ah, show = 'héroes' con una E no 'héroes'! ¡Trata eso! – Spacedman

Respuesta

4
items = root.findall('items') 

debería ser

items = root.findall('items/item') 
2

No está iterando sobre los elementos del 'elemento', de hecho está iterando sobre los elementos 'elementos'.

creo que debe ser:

items = root.findall('items') 
childItems = items.findall('item') 
for childItem in childItems: 
    childItem.find('title').text # should print: <![CDATA[Heroes Season 4 Subtitles]]> 
    childItem.find('link').text # Should print: http://www.allsubs.org/subs-download/heroes+season+4/1223435 
3

Esto funciona para mí. Tenga en cuenta que estoy usando urllib2 a conseguir a través de un proxy:

import urllib2 
from xml.etree import ElementTree as ET 

show = 'heroes' 
season = '4' 
language = 'en' 
limit = '1' 

requestURL = 'http://api.allsubs.org/index.php?' \ 
      + 'search=' + show \ 
      + '+season+' + season \ 
      + '&language=' + language \ 
      + '&limit=' + limit 

root = ET.parse(urllib2.urlopen(requestURL)).getroot() 
print root 
print '\n' 

items = root.findall('items')[0].findall('item') 
for item in items: 
    print item.find('title').text # should print: <![CDATA[Heroes Season 4 Subtitles]]> 
    print item.find('link').text # Should print: http://www.allsubs.org/subs-download/heroes+season+4/1223435/ 

nota que FindAll ('artículos') encuentra los "elementos" de etiquetas, lo que quiere para recorrer (creo) son las etiquetas "elemento" dentro de eso, así que terminamos() de esos. Además, necesita imprimir para obtener cualquier cosa de Python.

Además, si lo hago con límite = 2, aparece un:

Traceback (most recent call last): 
    File "heros.py", line 18, in <module> 
    root = ET.parse(urllib2.urlopen(requestURL)).getroot() 
    File "/usr/lib/python2.6/xml/etree/ElementTree.py", line 862, in parse 
    tree.parse(source, parser) 
    File "/usr/lib/python2.6/xml/etree/ElementTree.py", line 586, in parse 
    parser.feed(data) 
    File "/usr/lib/python2.6/xml/etree/ElementTree.py", line 1245, in feed 
    self._parser.Parse(data, 0) 
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 24, column 95 

No estoy seguro de que el XML volviendo de esta API está bien formado - no hay ningún elemento "xml" en el comienzo para principiantes. No confiaría en eso ...

+0

sí, no estoy seguro de si saben lo que están haciendo en ese sitio, gracias por el encabezado –

+0

así que urllib2 se usa para proxies? –

+0

es una de las cosas buenas que hace: respeta la configuración del entorno http_proxy y los proxies a través de ella. – Spacedman