PythonでXpathを使用する方法


224

Xpathをサポートするライブラリは何ですか?完全な実装はありますか?ライブラリはどのように使用されますか?そのウェブサイトはどこですか?


4
私は、この質問に対する答えが少し古くなっているという卑劣な疑いを抱いています。
ウォーレンP

4
@ gringo-suaveの回答は良いアップデートのようです。stackoverflow.com/a/13504511/1450294
Michael Scheper 2013年

ScrapyはXPathセレクターを提供します。
cs95

@WarrenPが言うように、ここでの答えのほとんどは非常に古い古いPython-2.xで、本当に古くなっています。たぶん、この質問にはpython-2.x
smci

回答:


129

libxml2には多くの利点があります。

  1. 仕様への準拠
  2. 積極的な開発とコミュニティの参加
  3. 速度。これは実際にはC実装のpythonラッパーです。
  4. ユビキタス。libxml2ライブラリは普及しているため、十分にテストされています。

欠点は次のとおりです。

  1. 仕様への準拠。厳しいです。他のライブラリでは、デフォルトの名前空間の処理などが簡単です。
  2. ネイティブコードの使用。これは、アプリケーションがどのように分散/展開されるかによって、面倒になる場合があります。この痛みの一部を軽減するRPMが利用可能です。
  3. 手動のリソース処理。以下のサンプルでは、​​freeDoc()およびxpathFreeContext()の呼び出しに注意してください。これはそれほどPythonicではありません。

単純なパス選択を行う場合は、ElementPython(Python 2.5に含まれています)を使用してください。完全な仕様への準拠または生の速度が必要で、ネイティブコードの配布に対応できる場合は、libxml2を使用してください。

libxml2 XPathの使用例


import libxml2

doc = libxml2.parseFile("tst.xml")
ctxt = doc.xpathNewContext()
res = ctxt.xpathEval("//*")
if len(res) != 2:
    print "xpath query: wrong node set size"
    sys.exit(1)
if res[0].name != "doc" or res[1].name != "foo":
    print "xpath query: wrong node set value"
    sys.exit(1)
doc.freeDoc()
ctxt.xpathFreeContext()

ElementTree XPathの使用例


from elementtree.ElementTree import ElementTree
mydoc = ElementTree(file='tst.xml')
for e in mydoc.findall('/foo/bar'):
    print e.get('title').text


8
osxでpython 2.7.10を使用してElementTreeを次のようにインポートする必要がありましたfrom xml.etree.ElementTree import ElementTree
Ben Page

Cラッパーであるため、EC2インスタンスまたはAWS LinuxのDockerイメージでコンパイルしない限り、AWS Lambdaにデプロイするのが難しい場合があります
CpILL


56

ここではlxml広告のように聞こえます。;)ElementTreeはstdライブラリに含まれています。2.6以下では、xpathはかなり弱いですが、2.7以降では大幅に改善されています。

import xml.etree.ElementTree as ET
root = ET.parse(filename)
result = ''

for elem in root.findall('.//child/grandchild'):
    # How to make decisions based on attributes even in 2.6:
    if elem.attrib.get('name') == 'foo':
        result = elem.text
        break

39

LXMLを使用します。LXMLはlibxml2とlibxsltのすべての機能を使用しますが、これらのライブラリにネイティブなPythonバインディングよりも「Python的」なバインディングでそれらをラップします。そのため、完全なXPath 1.0実装を取得します。ネイティブElemenTreeは、XPathの限定されたサブセットをサポートしますが、ニーズに十分対応できる場合があります。


29

別のオプションはpy-dom-xpathで、minidomとシームレスに動作し、純粋なPythonであるため、appengineで動作します。

import xpath
xpath.find('//item', doc)

2
すでにminidomを使用している場合は、lxmlおよびlibxml2よりも簡単です。美しく機能し、より「Pythonic」です。機能を使用すると、新しい検索コンテキストとして別のXPathの結果を使用してみましょう。contextfind
ベン

3
私もプラグインを作成するときにpy-dom-xpathを使用しています。これは純粋なpythonだからです。しかし、それはもう維持されているとは思わず、このバグに注意してください(「名前が 'text'である要素にアクセスできません」):code.google.com/p/py-dom-xpath/issues/detail?id = 8
Jon Coombs

py-dom-xpathは2010年に数年前に阻止されたようです。少なくともこれを回答に編集してください。
smci

14

以下を使用できます。

PyXML

from xml.dom.ext.reader import Sax2
from xml import xpath
doc = Sax2.FromXmlFile('foo.xml').documentElement
for url in xpath.Evaluate('//@Url', doc):
  print url.value

libxml2

import libxml2
doc = libxml2.parseFile('foo.xml')
for url in doc.xpathEval('//@Url'):
  print url.content

私はPyXMLコードをしようとすると、私が得たImportError: No module named extからfrom xml.dom.ext.reader import Sax2
Aminah Nuraini

9

elementtreeの最新バージョンはXPathをかなりよくサポートしています。XPathのエキスパートではないので、実装が完全であるかどうかは確かではありませんが、Pythonで作業するときのニーズのほとんどは満たしています。また、lxmlとPyXMLを使用しましたが、etreeは標準モジュールであるため、すばらしいと思います。

注:私はlxmlを見つけて以来、Pythonにとって間違いなく最高のXMLライブラリです。XPathも適切に機能します(ただし、完全な実装ではない可能性もあります)。


7
ElementTreeのXPathサポートは、現時点で最低限です。属性セレクターの欠如、デフォルト以外の軸がない、子のインデックス付けがないなど、機能には大きなギャップホールがあります。バージョン1.3(アルファ版)はこれらの機能の一部を追加しますが、それでも恥ずかしくない部分的な実装です。
James Brady、


7

XPATHの機能と、CSSをいつでも使用できる機能を組み合わせたい場合は、次を使用できますparsel

>>> from parsel import Selector
>>> sel = Selector(text=u"""<html>
        <body>
            <h1>Hello, Parsel!</h1>
            <ul>
                <li><a href="http://example.com">Link 1</a></li>
                <li><a href="http://scrapy.org">Link 2</a></li>
            </ul
        </body>
        </html>""")
>>>
>>> sel.css('h1::text').extract_first()
'Hello, Parsel!'
>>> sel.xpath('//h1/text()').extract_first()
'Hello, Parsel!'

「リンク1」と「リンク2」を取得したい場合、Xpathはどのように見えますか?
weefwefwqg3 2018

1
テキストを取得するには、次のようにする必要があります//li/a/text()
eLRuLL


3

PyXMLはうまく機能します。

どのプラットフォームを使用しているかは言いませんでしたが、Ubuntuを使用している場合はで取得できますsudo apt-get install python-xml。他のLinuxディストリビューションにもあると思います。

Macを使用している場合、xpathはすでにインストールされていますが、すぐにはアクセスできません。PY_USE_XMLPLUS環境で設定するか、xml.xpathをインポートする前にPythonで行うことができます。

if sys.platform.startswith('darwin'):
    os.environ['PY_USE_XMLPLUS'] = '1'

最悪の場合、自分で作成しなければならない場合があります。このパッケージはもはやメンテナンスされていませんが、正常にビルドされ、最新の2.x Pythonで動作します。基本的なドキュメントはこちらです。


0

あなたがhtmlのためにそれを必要とするなら:

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.