IT story

파이썬에서 Xpath를 사용하는 방법?

hot-time 2020. 4. 28. 08:23
반응형

파이썬에서 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

Use LXML. LXML uses the full power of libxml2 and libxslt, but wraps them in more "Pythonic" bindings than the Python bindings that are native to those libraries. As such, it gets the full XPath 1.0 implementation. Native ElemenTree supports a limited subset of XPath, although it may be good enough for your needs.


Another option is py-dom-xpath, it works seamlessly with minidom and is pure Python so works on appengine.

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

You can use:

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

The latest version of elementtree supports XPath pretty well. Not being an XPath expert I can't say for sure if the implementation is full but it has satisfied most of my needs when working in Python. I've also use lxml and PyXML and I find etree nice because it's a standard module.

NOTE: I've since found lxml and for me it's definitely the best XML lib out there for Python. It does XPath nicely as well (though again perhaps not a full implementation).


You can use the simple soupparser from lxml

Example:

from lxml.html.soupparser import fromstring

tree = fromstring("<a>Find me!</a>")
print tree.xpath("//a/text()")

If you want to have the power of XPATH combined with the ability to also use CSS at any point you can use 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!'

Another library is 4Suite: http://sourceforge.net/projects/foursuite/

I do not know how spec-compliant it is. But it has worked very well for my use. It looks abandoned.


PyXML works well.

You didn't say what platform you're using, however if you're on Ubuntu you can get it with sudo apt-get install python-xml. I'm sure other Linux distros have it as well.

If you're on a Mac, xpath is already installed but not immediately accessible. You can set PY_USE_XMLPLUS in your environment or do it the Python way before you import xml.xpath:

if sys.platform.startswith('darwin'):
    os.environ['PY_USE_XMLPLUS'] = '1'

In the worst case you may have to build it yourself. This package is no longer maintained but still builds fine and works with modern 2.x Pythons. Basic docs are here.


If you are going to need it for html:

import lxml.html as html
root  = html.fromstring(string)
root.xpath('//meta')

참고URL : https://stackoverflow.com/questions/8692/how-to-use-xpath-in-python

반응형