Các thư viện hỗ trợ Xpath là gì? Có thực hiện đầy đủ? Thư viện được sử dụng như thế nào? Trang web của nó ở đâu?
Các thư viện hỗ trợ Xpath là gì? Có thực hiện đầy đủ? Thư viện được sử dụng như thế nào? Trang web của nó ở đâu?
Câu trả lời:
libxml2 có một số lợi thế:
Nhược điểm bao gồm:
Nếu bạn đang thực hiện lựa chọn đường dẫn đơn giản, hãy gắn bó với ElementTree (được bao gồm trong Python 2.5). Nếu bạn cần tuân thủ đầy đủ thông số kỹ thuật hoặc tốc độ thô và có thể đối phó với việc phân phối mã gốc, hãy đi với libxml2.
Mẫu sử dụng 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()
Mẫu sử dụng 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
Các gói lxml hỗ trợ XPath. Nó có vẻ hoạt động khá tốt, mặc dù tôi đã gặp một số rắc rối với trục self ::. Có cả Amara , nhưng tôi chưa từng sử dụng nó.
Âm thanh như một quảng cáo lxml ở đây. ;) ElementTree được bao gồm trong thư viện tiêu chuẩn. Dưới 2,6 và thấp hơn xpath của nó khá yếu, nhưng trong 2,7+ được cải thiện nhiều :
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
Sử dụng LXML. LXML sử dụng toàn bộ sức mạnh của libxml2 và libxslt, nhưng bao bọc chúng trong các ràng buộc "Pythonic" hơn các ràng buộc Python có nguồn gốc từ các thư viện đó. Như vậy, nó được triển khai XPath 1.0 đầy đủ. Bản gốc ElemenTree hỗ trợ một tập hợp con XPath giới hạn, mặc dù nó có thể đủ tốt cho nhu cầu của bạn.
Một tùy chọn khác là py-dom-xpath , nó hoạt động trơn tru với minidom và là Python thuần túy nên hoạt động trên appengine.
import xpath
xpath.find('//item', doc)
context
trong find
cho phép bạn sử dụng kết quả xpath khác làm bối cảnh tìm kiếm mới.
Bạn có thể dùng:
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
từfrom xml.dom.ext.reader import Sax2
Phiên bản mới nhất của Elementtree hỗ trợ XPath khá tốt. Không phải là một chuyên gia XPath, tôi không thể chắc chắn rằng việc triển khai đã đầy đủ hay chưa nhưng nó đã đáp ứng hầu hết các nhu cầu của tôi khi làm việc với Python. Tôi cũng đã sử dụng lxml và PyXML và tôi thấy etree rất hay vì đây là mô-đun chuẩn.
LƯU Ý: Tôi đã tìm thấy lxml và đối với tôi, đó chắc chắn là lib XML tốt nhất hiện có cho Python. Nó cũng làm XPath độc đáo (mặc dù một lần nữa có lẽ không phải là một triển khai đầy đủ).
Bạn có thể sử dụng đơn giản soupparser
từlxml
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
Nếu bạn muốn có sức mạnh của XPATH kết hợp với khả năng sử dụng CSS tại bất kỳ thời điểm nào bạn có thể sử dụng 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()
Một thư viện khác là 4Suite: http://sourceforge.net/projects/foursuite/
Tôi không biết làm thế nào nó tuân thủ thông số kỹ thuật. Nhưng nó đã làm việc rất tốt cho việc sử dụng của tôi. Có vẻ bị bỏ rơi.
PyXML hoạt động tốt.
Bạn không nói bạn đang sử dụng nền tảng nào, tuy nhiên nếu bạn sử dụng Ubuntu, bạn có thể sử dụng nền tảng đó sudo apt-get install python-xml
. Tôi chắc chắn các bản phân phối Linux khác cũng có nó.
Nếu bạn đang sử dụng máy Mac, xpath đã được cài đặt nhưng không thể truy cập ngay lập tức. Bạn có thể đặt PY_USE_XMLPLUS
trong môi trường của mình hoặc thực hiện theo cách Python trước khi nhập xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
Trong trường hợp xấu nhất bạn có thể phải tự xây dựng nó. Gói này không còn được duy trì nhưng vẫn xây dựng tốt và hoạt động với Pythons 2.x hiện đại. Tài liệu cơ bản ở đây .