3

.net の xpath と python の sax の大ファンですが、python で xpath を使用するのは初めてです。

xpath を使用してドキュメントからいくつかのノードを選択し、それらを反復処理してから、理想的には xpath を使用してそれらから関連データを取得する小さなスクリプトがあります。ただし、xmlNode を取得すると、そこからコンテキストを取得できません。

import libxml2
import urllib

doc = libxml2.parseDoc(
        urllib.urlopen('http://somemagicwebservice.com/').read())
ctxt = doc.xpathNewContext()
listitems = ctxt.xpathEval('//List/ListItem')
for item in listitems:
    itemctxt = item.xpathNewContext()
    title = itemctxt.xpathEval('//ItemAttributes/Title')
    asin = itemctxt.xpathEval('//Item/ASIN')
    itemctxc.xpathFreeContext()
ctxt.xpathFreeContext()
doc.freeDoc()

ただし、itemctxt = item.xpathNewContext()ビットは失敗します

itemctxt = item.xpathNewContext()
AttributeError: xmlNode instance has no attribute 'xpathNewContext'

xmlNode で xpath を使用する方法はありますか? 良いオンライン情報が見つかりません。ありがとう

4

2 に答える 2

2

XPathContextが要素に意味をなさないと思いますか?新しいXPathContextを作成し、そのノードを現在の要素に設定してみてください。

とは言うものの、私はlibxml2を直接使用したことがないので、少し野蛮な推測です。私は通常、libxml2とlibxsltの周りにElementTreeAPIを公開するlxmlを使用します。使い方ははるかに簡単で、実際に要素でxpath()を使用できます。もちろん、libxml2を使用するコードがすでにたくさんある場合は、おそらく切り替えたくないでしょうが、その場合は、lxmlsソースを調べてどのように行われるかを確認することをお勧めします。

http://codespeak.net/svn/lxml/trunk/src/lxml/xpath.pxi

http://codespeak.net/svn/lxml/trunk/src/lxml/_elementpath.py

良い出発点のようです。

于 2009-07-05T14:06:19.407 に答える
2

https://stackoverflow.com/a/3379708/288875setContextNode(..)は、新しく作成されたコンテキストを呼び出すことを提案しています:

itemctxt = doc.xpathNewContext()

for item in listitems:
    itemctxt.setContextNode(item)
    title = itemctxt.xpathEval('.//ItemAttributes/Title')

    ...

itemctxt.xpathFreeContext()

私が現在使用しているpython libxml(2.9.1)のバージョンでは、次のように呼び出すことさえできることがわかりました:

item.xpathEval('.//ItemAttributes/Title')

.//xpath 式の先頭に( の代わりに)ドットを追加する必要があることに注意してください。//そうしないと、ドキュメント ルートに関連する検索結果が得られます。

于 2015-09-17T11:20:23.947 に答える