0

さて、これは私を少し狂わせ始めています。Python 用の xml/xpath ライブラリをいくつか試しましたが、臭い「タイトル」要素を取得する簡単な方法がわかりません。

最新の試みは次のようになります (Amara を使用):

def view(req, url):
    req.content_type = 'text/plain'
    doc = amara.parse(urlopen(url))
    for node in doc.xml_xpath('//title'):
    req.write(str(node)+'\n')

しかし、それは何も出力しません。私の XML は次のようになります: http://programanddesign.com/feed/atom/

//*代わりに試してみると、//titleすべてが期待どおりに返されます。XML にtitles が含まれていることはわかっていますが、何が問題なのですか? 名前空間か何かですか?もしそうなら、どうすれば修正できますか?


プレフィックスなしで動作するようには見えませんが、これは動作します:

def view(req, url):
    req.content_type = 'text/plain'
    doc = amara.parse(url, prefixes={'atom': 'http://www.w3.org/2005/Atom'})
    req.write(str(doc.xml_xpath('//atom:title')))
4

2 に答える 2

1

おそらく、扱っているドキュメントの名前空間を考慮に入れる必要があるだけです。

Amara で名前空間を処理する方法を調べることをお勧めします。

http://www.xml3k.org/Amara/Manual#namespaces

編集: コード スニペットを使用して、いくつかの編集を行いました。使用している Amara のバージョンはわかりませんが、ドキュメントに基づいて、可能な限り対応できるようにしました。

def view(req, url):
    req.content_type = 'text/plain'
    ns = {u'f' : u'http://www.w3.org/2005/Atom',
        u't' : u'http://purl.org/syndication/thread/1.0'}
    doc = amara.parse(urlopen(url), prefixes=ns)
    req.write(str(doc.xml_xpath(u'f:title')))
于 2009-10-18T06:46:57.483 に答える
1

それは確かに名前空間です。lxml ドキュメントで見つけるのは少し難しかったですが、その方法は次のとおりです。

from lxml import etree
doc = etree.parse(open('index.html'))
doc.xpath('//default:title', namespaces={'default':'http://www.w3.org/2005/Atom'})

これを行うこともできます:

title_finder = etree.ETXPath('//{http://www.w3.org/2005/Atom}title')
title_finder(doc)

どちらの場合も、タイトルを取り戻すことができます。

于 2009-10-18T07:08:03.473 に答える