파이썬에서 Xpath를 사용하는 방법? 지원하는 라이브러리는 무엇입니까? 완전한 구현이 있습니까?

Xpath를 지원하는 라이브러리는 무엇입니까? 완전한 구현이 있습니까? 도서관은 어떻게 사용됩니까? 웹 사이트는 어디에 있습니까?



답변

libxml2 는 여러 가지 장점이 있습니다.

  1. 사양 준수
  2. 적극적인 개발과 지역 사회 참여
  3. 속도. 이것은 실제로 C 구현에 대한 파이썬 래퍼입니다.
  4. 편재. libxml2 라이브러리는 널리 사용되므로 잘 테스트되었습니다.

단점은 다음과 같습니다.

  1. 사양 준수 . 엄격합니다. 다른 라이브러리에서는 기본 네임 스페이스 처리와 같은 것이 더 쉽습니다.
  2. 네이티브 코드 사용 애플리케이션 배포 / 배포 방식에 따라 어려움이있을 수 있습니다. 이 고통을 덜어주는 RPM을 사용할 수 있습니다.
  3. 수동 리소스 처리. 아래 샘플에서 freeDoc () 및 xpathFreeContext ()에 대한 호출에 유의하십시오. 이것은 파이썬이 아닙니다.

간단한 경로 선택을하고 있다면 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


답변

lxml이 패키지 지원은 XPATH. self :: axis에 문제가 있었지만 꽤 잘 작동하는 것 같습니다. 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의 모든 기능을 사용하지만 해당 라이브러리에 고유 한 Python 바인딩보다 더 많은 “Pythonic”바인딩으로 랩핑합니다. 따라서 전체 XPath 1.0 구현을 얻습니다. Native ElemenTree는 XPath의 제한된 하위 집합을 지원하지만 필요에 따라 충분할 수도 있습니다.


답변

또 다른 옵션은 py-dom-xpath 이며, minidom과 완벽하게 작동하며 순수한 Python이므로 appengine에서 작동합니다.

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


답변

당신이 사용할 수있는:

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


답변

elementtree 의 최신 버전 은 XPath를 꽤 잘 지원합니다. XPath 전문가가 아니기 때문에 구현이 가득 찼는 지 확실하게 말할 수는 없지만 Python에서 작업 할 때 대부분의 요구를 충족했습니다. 나는 또한 lxml과 PyXML을 사용했으며 표준 모듈이기 때문에 etree가 훌륭하다는 것을 알았습니다.

참고 : 나는 lxml을 찾았으며 파이썬을위한 최고의 XML 라이브러리입니다. XPath도 훌륭하게 수행합니다 (다시 완전한 구현은 아니지만).