2

このXMLを解析しようとしています。YouTube フィードです。チュートリアルのコードに基づいて作業しています。entryの下にネストされているすべてのノードを取得したいfeed

from lxml import etree
root = etree.fromstring(text)
entries = root.xpath("/feed/entry")
print entries

何らかの理由entriesで空のリストです。なんで?

4

2 に答える 2

4

feedそのすべての子は実際にはhttp://www.w3.org/2005/Atom名前空間にあります。xpath に次のことを伝える必要があります。

entries = root.xpath("/atom:feed/atom:entry", 
                     namespaces={'atom': 'http://www.w3.org/2005/Atom'})

または、デフォルトの空の名前空間を変更する場合:

entries = root.xpath("/feed/entry", 
                     namespaces={None: 'http://www.w3.org/2005/Atom'})

または、ショートハンドルをまったく使用したくない場合:

entries = root.xpath("/{http://www.w3.org/2005/Atom}feed/{http://www.w3.org/2005/Atom}entry")

私の知る限り、「ローカル名前空間」は、作業しているノードに対して暗黙的に想定されているため、同じ名前空間内の子に対する操作で再度設定する必要はありません。したがって、次の行に沿って何かを実行できるはずです。

feed = root.find("/atom:feed",
                     namespaces={'atom': 'http://www.w3.org/2005/Atom'})

title = feed.xpath("title")
entries = feed.xpath("entries")
# etc...
于 2013-08-21T11:20:58.543 に答える
1

これは、XML の名前空間が原因です。ここに説明があります: http://www.edankert.com/defaultnamespaces.html#Conclusion .

于 2013-08-21T11:16:59.767 に答える