0

XML を解析する次のコードがありますが、子を反復処理できません。

import urllib, urllib2, re, time, os
import xml.etree.ElementTree as ET 

def wgetUrl(target):
    try:
        req = urllib2.Request(target)
        req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3 Gecko/2008092417 Firefox/3.0.3')
        response = urllib2.urlopen(req)
        outtxt = response.read()
        response.close()
    except:
        return ''
    return outtxt

newUrl = 'http://feeds.rasset.ie/rteavgen/player/playlist?showId=10056467'

data = wgetUrl(newUrl)
tree = ET.fromstring(data)
#tree = ET.parse(data)
for elem in tree.iter('entry'):
    print elem.tag, elem.attrib

ここで、反復から「エントリ」を削除すると、次のような出力が得られます (なぜ URL ??):

{http://www.w3.org/2005/Atom}entry {}
{http://www.w3.org/2005/Atom}id {}
{http://www.w3.org/2005/Atom}published {}
{http://www.w3.org/2005/Atom}updated {}
{http://www.w3.org/2005/Atom}title {'type': 'text'}

しかし、次のように iter ステートメントを記述しても、エントリする子が見つかりません。

for elem in tree.iter('{http://www.w3.org/2005/Atom}entry'):
    print elem.tag, elem.attrib

子要素ではなく、エントリ要素のみを取得します。

{http://www.w3.org/2005/Atom}entry {}

私が間違っていることは何ですか?

私はどこでも検索しましたが、これを理解できません...私はこれに慣れていないので、ばかげている場合は申し訳ありません。

4

1 に答える 1

1

Atom フィードを解析している場合は、代わりにライブラリを使用することを強くお勧めします。これにより、これらすべての詳細が処理され、さらに多くの処理が行われます。feedparser

その{http://www.w3.org/2005/Atom}部分は名前空間です。entryタグを選択するには、その名前空間を指定する必要があります。

for elem in tree.iterfind('ns:entry', {'ns': 'http://www.w3.org/2005/Atom'}):

辞書を使用してns:プレフィックスを名前空間にマップするか、同じ中括弧構文を使用できます。

for elem in tree.iterfind('{http://www.w3.org/2005/Atom}entry'):

要素を取得したら、その子を明示的に見つける必要があります。

for elem in tree.iterfind('{http://www.w3.org/2005/Atom}entry'):
    for child in elem:
        print child
于 2013-01-26T16:08:31.467 に答える