2010-12-15 9 views
6

私はスタック/ドキュメントに関するいくつかのチュートリアル/その他の質問を探していますが、まだ理解できません。 ugh !!!Python(newbie)APIコールからXMLを解析する

APIリクエストと構文解析を行い(変数に割り当てたいが、それはこの質問にボーナスです)、これが私の試みです。なぜアイテムのタイトルとリンクをリストアップできないのですか?

#!/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/ 

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

UPDATE:これは助けのため、おかげで働いていたし、私のタイプミスを指摘

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はrequestURLです。私はの結果がありません - 私あなたはそれを正しくしていないと思う... – Spacedman

+1

ああ、ショー= 'ヒーローズ' Eと 'ヒーローズ'!それを試してみて! – Spacedman

答えて

4
items = root.findall('items') 

する必要があります

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

あなたは 'item'要素を反復しているわけではありません。実際には 'items'要素を反復しています。

私はそれがあるべきだと思う:

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

これは私のために動作します。あなたは(私は思う)をループに何をしたい「アイテム」タグ、「アイテム」のタグがあるが見つかっ(「アイテム」)のfindAll

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/ 

注:私はプロキシを介して取得するurllib2のを使用しています注意してくださいその中で、私たちはそれらのすべてを見つけます。また、あなたはPythonから何かを得るために印刷する必要があります。私は限界= 2でそれを行う場合

また、私が取得:

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 

私は、このAPIから戻ってくるXMLが整形式であるかわからない - 何の「XML」の要素はでありません初心者のためのスタート。私はそれを信用しません...

+0

彼らがそのサイトで何をしているのかわからない場合は、 –

+0

の頭のおかげでurllib2が代理人に使われますか? –

+0

それは良いことの1つです - それはhttp_proxy環境設定とそれを介してプロキシを尊重します。 – Spacedman

関連する問題