このXMLを解析しようとしています。YouTube フィードです。チュートリアルのコードに基づいて作業しています。entry
の下にネストされているすべてのノードを取得したいfeed
。
from lxml import etree
root = etree.fromstring(text)
entries = root.xpath("/feed/entry")
print entries
何らかの理由entries
で空のリストです。なんで?
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...
これは、XML の名前空間が原因です。ここに説明があります: http://www.edankert.com/defaultnamespaces.html#Conclusion .