Xpathをサポートするライブラリは何ですか?完全な実装はありますか?ライブラリはどのように使用されますか?そのウェブサイトはどこですか?
Xpathをサポートするライブラリは何ですか?完全な実装はありますか?ライブラリはどのように使用されますか?そのウェブサイトはどこですか?
回答:
libxml2には多くの利点があります。
欠点は次のとおりです。
単純なパス選択を行う場合は、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
from xml.etree.ElementTree import ElementTree
lxmlのパッケージのサポートは、XPath。self ::軸で問題が発生しましたが、かなりうまくいくようです。アマラもありますが、個人的には使用していません。
ここでは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
LXMLを使用します。LXMLはlibxml2とlibxsltのすべての機能を使用しますが、これらのライブラリにネイティブなPythonバインディングよりも「Python的」なバインディングでそれらをラップします。そのため、完全なXPath 1.0実装を取得します。ネイティブElemenTreeは、XPathの限定されたサブセットをサポートしますが、ニーズに十分対応できる場合があります。
別のオプションはpy-dom-xpathで、minidomとシームレスに動作し、純粋なPythonであるため、appengineで動作します。
import xpath
xpath.find('//item', doc)
context
find
以下を使用できます。
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
ImportError: No module named ext
からfrom xml.dom.ext.reader import Sax2
elementtreeの最新バージョンはXPathをかなりよくサポートしています。XPathのエキスパートではないので、実装が完全であるかどうかは確かではありませんが、Pythonで作業するときのニーズのほとんどは満たしています。また、lxmlとPyXMLを使用しましたが、etreeは標準モジュールであるため、すばらしいと思います。
注:私はlxmlを見つけて以来、Pythonにとって間違いなく最高のXMLライブラリです。XPathも適切に機能します(ただし、完全な実装ではない可能性もあります)。
soupparser
から簡単に使用できますlxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
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!'
//li/a/text()
別のライブラリは4Suiteです:http : //sourceforge.net/projects/foursuite/
仕様にどの程度準拠しているかはわかりません。しかし、それは私の使用のために非常にうまく機能しました。放棄されたようです。
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で動作します。基本的なドキュメントはこちらです。