Python에서 XPath를 사용하는 방법?
XPath를 지원하는 라이브러리는 무엇인가?완전한 구현이 있는가?도서관은 어떻게 이용되는가?그것의 웹사이트는 어디에 있니?
libxml2에는 다음과 같은 여러 가지 장점이 있다.
- 사양 준수
- 적극적인 개발 및 지역사회 참여
- 속도. 이건 정말 C 구현을 둘러싼 파이톤 포장지야.
- 유비쿼터스.libxml2 라이브러리는 널리 보급되어 있으며 따라서 잘 테스트되었다.
단점은 다음과 같다.
- 규격 준수.엄격하다.기본 네임스페이스 처리와 같은 작업은 다른 라이브러리에서 더 쉽다.
- 네이티브 코드 사용.이는 애플리케이션의 배포/배포 방식에 따라 문제가 될 수 있다.RPM은 이러한 통증을 완화시켜 준다.
- 수동 리소스 처리.아래 샘플의 freeDoc() 및 xpathFreeContext()에 대한 호출을 참고하십시오.이것은 그다지 피토닉적이지 않다.
단순 경로 선택을 수행하는 경우 요소를 그대로 유지하십시오.트리(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()
원소의 표본트리 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를 지원한다.꽤 잘 작동하는 것 같은데, 비록 내가 자기 자신: 축에 문제가 있긴 했지만.아마라도 있지만 개인적으로 사용한 적은 없다.
lxml 광고처럼 들리는데;) 요소나무는 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 바인딩보다 더 "피소닉" 바인딩으로 래핑하십시오.따라서, 그것은 완전한 XPath 1.0 구현을 얻는다.Native ElemenTree는 XPath의 제한된 서브셋을 지원하지만, 그것이 당신의 필요에 충분할 수도 있다.
또 다른 옵션은 py-dom-xpath로 미니돔과 원활하게 작동하며 순수 파이썬이기 때문에 애플엔진에서 작동한다.
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
당신은 간단한 것을 사용할 수 있다.soupparser
로부터lxml
예:
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")
엘리먼트 트리의 최신 버전은 XPath를 꽤 잘 지원한다.XPath 전문가가 아닌 나는 구현이 꽉 찼는지 확실히 말할 수 없지만 Python에서 작업할 때 내가 필요로 하는 대부분을 충족시켰다.나는 또한 lxml과 PyXML을 사용했는데, 표준 모듈이기 때문에 Etree가 좋다고 생각한다.
참고: 그 이후로 lxml을 찾았고, 나에게 있어 그것은 단연 파이썬에게 최고의 XML lib이다.또한 XPath도 훌륭하게 수행한다(또한 완전한 구현은 아닐 수 있음).
언제든지 CSS를 사용할 수 있는 기능과 XPATH의 힘을 결합하려면 다음을 사용하십시오.
>>> 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!'
또 다른 도서관은 4Suite: http://sourceforge.net/projects/foursuite/이다.
나는 그것이 얼마나 규격화된 것인지 모른다.하지만 그것은 내가 사용하기에 매우 효과적이었다.버려진 것 같아.
PyXML은 잘 작동한다.
어떤 플랫폼을 사용 중인지 말하지 않았지만, 우분투에서 사용 중이라면 사용 가능sudo apt-get install python-xml
다른 리눅스 디스트로들도 가지고 있을 겁니다.
Mac에 있는 경우 xpath가 이미 설치되어 있지만 즉시 액세스할 수 없는 경우.설정할 수 있다PY_USE_XMLPLUS
xml.xpathxml를 가져오기 전에 Python 하거나 Python 방식을 하십시오.
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS'] = '1'
최악의 경우 직접 지어야 할 수도 있다.이 패키지는 더 이상 유지되지 않고 여전히 잘 만들어지며 현대판 2.x피톤과 함께 작동한다.기본 문서들이 여기 있어
참조URL: https://stackoverflow.com/questions/8692/how-to-use-xpath-in-python
'IT이야기' 카테고리의 다른 글
순차적으로 관찰 가능성과 하나의 결과 도출 (0) | 2022.04.01 |
---|---|
Vue.js - 루트 요소가 v-for를 가질 수 없고 분할 래퍼가 필요한 이유 (0) | 2022.04.01 |
개체의 특성 나열 (0) | 2022.04.01 |
뉴라인 없이 인쇄(인쇄 'a'), 인쇄 공간, 제거 방법? (0) | 2022.04.01 |
Vue.js 경로 변경 모달 열기 (0) | 2022.04.01 |