Apa perpustakaan yang mendukung Xpath? Apakah ada implementasi penuh? Bagaimana perpustakaan digunakan? Di mana situs webnya?
Apa perpustakaan yang mendukung Xpath? Apakah ada implementasi penuh? Bagaimana perpustakaan digunakan? Di mana situs webnya?
Jawaban:
libxml2 memiliki sejumlah keunggulan:
Kerugian meliputi:
Jika Anda melakukan pemilihan jalur sederhana, tetap dengan ElementTree (yang termasuk dalam Python 2.5). Jika Anda membutuhkan kepatuhan spesifikasi penuh atau kecepatan mentah dan dapat mengatasi distribusi kode asli, lanjutkan dengan libxml2.
Contoh Penggunaan XPath libxml2
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()
Contoh Penggunaan 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
The paket lxml mendukung XPath. Tampaknya bekerja dengan cukup baik, meskipun saya memiliki beberapa masalah dengan sumbu self ::. Ada juga Amara , tetapi saya belum menggunakannya secara pribadi.
Kedengarannya seperti iklan lxml di sini. ;) ElementTree termasuk dalam perpustakaan std. Di bawah 2.6 dan di bawah xpath-nya cukup lemah, tetapi di 2.7+ lebih baik :
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
Gunakan LXML. LXML menggunakan kekuatan penuh libxml2 dan libxslt, tetapi membungkusnya lebih banyak "Pythonic" binding daripada Python binding yang asli ke perpustakaan itu. Dengan demikian, ia akan mendapatkan implementasi penuh XPath 1.0. Native ElemenTree mendukung subset terbatas XPath, meskipun mungkin cukup baik untuk kebutuhan Anda.
Pilihan lain adalah py-dom-xpath , ia bekerja dengan mulus dengan minidom dan Python murni jadi berfungsi pada appengine.
import xpath
xpath.find('//item', doc)
context
dalam find
fungsi membiarkan Anda menggunakan hasil xpath lain sebagai konteks pencarian baru.
Kamu bisa memakai:
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
darifrom xml.dom.ext.reader import Sax2
Versi terbaru dari elementtree mendukung XPath dengan cukup baik. Tidak menjadi ahli XPath saya tidak bisa mengatakan dengan pasti apakah implementasinya penuh tetapi telah memenuhi sebagian besar kebutuhan saya ketika bekerja dengan Python. Saya juga menggunakan lxml dan PyXML dan saya merasa etree bagus karena ini adalah modul standar.
CATATAN: Saya sejak menemukan lxml dan bagi saya itu jelas merupakan XML lib terbaik di luar sana untuk Python. Itu tidak baik XPath juga (meskipun sekali lagi mungkin bukan implementasi penuh).
Anda dapat menggunakan yang sederhana soupparser
darilxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Jika Anda ingin memiliki kekuatan XPATH dikombinasikan dengan kemampuan untuk juga menggunakan CSS di titik mana pun Anda dapat menggunakan 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()
Pustaka lain adalah 4Suite: http://sourceforge.net/projects/foursuite/
Saya tidak tahu bagaimana memenuhi spesifikasi itu. Tetapi itu telah bekerja dengan sangat baik untuk saya gunakan. Itu terlihat ditinggalkan.
PyXML berfungsi dengan baik.
Anda tidak mengatakan platform apa yang Anda gunakan, namun jika Anda menggunakan Ubuntu, Anda bisa mendapatkannya sudo apt-get install python-xml
. Saya yakin distro Linux lain juga memilikinya.
Jika Anda menggunakan Mac, xpath sudah diinstal tetapi tidak segera dapat diakses. Anda dapat mengatur PY_USE_XMLPLUS
di lingkungan Anda atau melakukannya dengan cara Python sebelum Anda mengimpor xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
Dalam kasus terburuk Anda mungkin harus membangunnya sendiri. Paket ini tidak lagi dipertahankan tetapi masih membangun dengan baik dan bekerja dengan Python 2.x modern. Dokumen dasar ada di sini .