ไลบรารีใดบ้างที่รองรับ Xpath มีการนำไปใช้อย่างเต็มรูปแบบหรือไม่? มีการใช้ห้องสมุดอย่างไร เว็บไซต์อยู่ที่ไหน
ไลบรารีใดบ้างที่รองรับ Xpath มีการนำไปใช้อย่างเต็มรูปแบบหรือไม่? มีการใช้ห้องสมุดอย่างไร เว็บไซต์อยู่ที่ไหน
คำตอบ:
libxml2มีข้อดีหลายประการ:
ข้อเสียรวมถึง:
หากคุณกำลังเลือกเส้นทางอย่างง่าย ๆ ให้ใช้ElementTree (ซึ่งรวมอยู่ใน 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 ดูเหมือนว่าจะทำงานได้ดีแม้ว่าฉันจะมีปัญหากับแกนตัวเอง :: นอกจากนี้ยังมีAmaraแต่ฉันไม่ได้ใช้เป็นการส่วนตัว
ฟังดูเหมือนโฆษณา 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 แต่ล้อมรอบพวกมันไว้ในการผูก "Pythonic" มากกว่าการผูก Python ที่อยู่ในไลบรารีเหล่านั้น เช่นนั้นจะได้รับการใช้งาน XPath 1.0 แบบเต็ม Native ElemenTree รองรับชุดย่อยของ XPath ที่ จำกัด แม้ว่ามันจะดีพอสำหรับความต้องการของคุณ
อีกทางเลือกหนึ่งคือpy-dom-xpathมันทำงานได้อย่างราบรื่นกับ minidom และเป็น Python ที่บริสุทธิ์ดังนั้นจึงใช้ได้กับ appengine
import xpath
xpath.find('//item', doc)
context
ในfind
ฟังก์ชั่นให้คุณใช้ผล XPath อื่นเป็นบริบทค้นหาใหม่
คุณสามารถใช้ได้:
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 และสำหรับฉันมันคือ lib XML ที่ดีที่สุดสำหรับ Python มันทำ 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ทำงานได้ดี
คุณไม่ได้พูดในสิ่งที่แพลตฟอร์มที่คุณใช้ sudo apt-get install python-xml
แต่ถ้าคุณอยู่ในอูบุนตูคุณจะได้รับมันด้วย ฉันแน่ใจว่า distros Linux อื่นมีเช่นกัน
หากคุณใช้ Mac xpath ได้รับการติดตั้งแล้ว แต่ไม่สามารถเข้าถึงได้ทันที คุณสามารถตั้งค่าPY_USE_XMLPLUS
ในสภาพแวดล้อมของคุณหรือทำด้วยวิธี Python ก่อนที่คุณจะนำเข้า xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
ในกรณีที่เลวร้ายที่สุดคุณอาจต้องสร้างมันขึ้นมาเอง แพ็คเกจนี้ไม่ได้รับการบำรุงรักษาอีกต่อไป แต่ก็ยังสร้างได้ดีและใช้งานได้กับ 2.x Pythons ที่ทันสมัย เอกสารพื้นฐานที่นี่
หากคุณจะต้องการมันสำหรับhtml :
import lxml.html as html
root = html.fromstring(string)
root.xpath('//meta')