Как говорит @WarrenP, большинство ответов здесь - крайне устаревший Python-2.x, действительно устаревший. Может быть, этот вопрос должен быть помечен python-2.x
Скорость. Это действительно оболочка Python для реализации на Си.
Ubiquity. Библиотека libxml2 широко распространена и поэтому хорошо протестирована.
Недостатки включают в себя:
Соответствие спецификации . Это строгое Такие вещи, как обработка пространства имен по умолчанию, проще в других библиотеках.
Использование нативного кода. Это может быть проблемой в зависимости от того, как ваше приложение распределено / развернуто. Доступны RPM, которые облегчают эту боль.
Ручная обработка ресурсов. Обратите внимание на приведенный ниже пример вызовов freeDoc () и xpathFreeContext (). Это не очень Pythonic.
Если вы делаете простой выбор пути, придерживайтесь ElementTree (который включен в Python 2.5). Если вам нужно полное соответствие спецификациям или грубая скорость и вы можете справиться с распространением нативного кода, используйте libxml2.
Пример использования XPath libxml2
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.ElementTreeimportElementTree
mydoc =ElementTree(file='tst.xml')for e in mydoc.findall('/foo/bar'):print e.get('title').text
используя python 2.7.10 на osx, мне пришлось импортировать ElementTree какfrom xml.etree.ElementTree import ElementTree
Бен Страница
потому что это оболочка C, вы можете столкнуться с трудностями при ее развертывании в AWS Lambda, если вы не скомпилируете экземпляр EC2 или образ Docker из AWS Linux
CpILL
85
Пакет lxml поддерживает xpath. Кажется, это работает довольно хорошо, хотя у меня были некоторые проблемы с осью self ::. Есть также Амара , но я не использовал это лично.
Пожалуйста, добавьте некоторые основные сведения о том, как использовать XPath с lxml.
jpmc26
56
Похоже, реклама LXML здесь. ;) ElementTree включен в библиотеку std. Под 2.6 и ниже его xpath довольно слаб, но в 2.7+ значительно улучшен :
import xml.etree.ElementTreeas 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.textbreak
Используйте LXML. LXML использует всю мощь libxml2 и libxslt, но заключает их в более «Pythonic» привязки, чем в привязки Python, которые являются родными для этих библиотек. Таким образом, он получает полную реализацию XPath 1.0. Native ElemenTree поддерживает ограниченное подмножество XPath, хотя оно может быть достаточно для ваших нужд.
Проще, чем lxml и libxml2, если вы уже работаете с minidom. Работает красиво и более "Pythonic". Функция contextin findпозволяет вам использовать другой результат xpath в качестве нового контекста поиска.
Бен
3
Я тоже использовал py-dom-xpath, когда пишу плагин, потому что это чистый python. Но я не думаю, что это больше поддерживается, и помните об этой ошибке («Не удается получить доступ к элементу с именем« text »»): code.google.com/p/py-dom-xpath/issues/detail?id = 8
from xml.dom.ext.reader importSax2from 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
когда я попробовал код PyXML, я получил ImportError: No module named extотfrom xml.dom.ext.reader import Sax2
Aminah Nuraini
9
Последняя версия elementtree очень хорошо поддерживает XPath. Не будучи экспертом по XPath, я не могу точно сказать, является ли реализация полной, но она удовлетворила большинство моих потребностей при работе в Python. Я также использую lxml и PyXML и нахожу этри хорошим, потому что это стандартный модуль.
ПРИМЕЧАНИЕ: с тех пор я нашел lxml и для меня это определенно лучшая библиотека XML для Python. Он также хорошо работает с XPath (хотя, возможно, не полная реализация).
Поддержка ElementTree XPath в настоящее время минимальна в лучшем случае. В функциональности есть огромные дыры, такие как отсутствие селекторов атрибутов, отсутствие осей, отличных от заданных по умолчанию, отсутствие индексации дочерних элементов и т. Д. В версии 1.3 (в альфа-версии) добавлены некоторые из этих функций, но это все еще довольно частичная реализация.
Джеймс Брэди
8
Вы можете использовать простой soupparserизlxml
Пример:
from lxml.html.soupparser import fromstring
tree = fromstring("<a>Find me!</a>")print tree.xpath("//a/text()")
Вы не сказали, какую платформу вы используете, однако, если вы используете Ubuntu, вы можете получить ее sudo apt-get install python-xml. Я уверен, что другие дистрибутивы Linux также есть.
Если вы работаете на Mac, xpath уже установлен, но не доступен сразу. Вы можете установить PY_USE_XMLPLUSв своей среде или сделать это Python, прежде чем импортировать xml.xpath:
if sys.platform.startswith('darwin'):
os.environ['PY_USE_XMLPLUS']='1'
В худшем случае вам, возможно, придется создать его самостоятельно. Этот пакет больше не поддерживается, но все еще прекрасно работает и работает с современными 2.x Pythons. Основные документы здесь .
Ответы:
libxml2 имеет ряд преимуществ:
Недостатки включают в себя:
Если вы делаете простой выбор пути, придерживайтесь ElementTree (который включен в Python 2.5). Если вам нужно полное соответствие спецификациям или грубая скорость и вы можете справиться с распространением нативного кода, используйте libxml2.
Пример использования XPath libxml2
Пример использования ElementTree XPath
источник
from xml.etree.ElementTree import ElementTree
Пакет lxml поддерживает xpath. Кажется, это работает довольно хорошо, хотя у меня были некоторые проблемы с осью self ::. Есть также Амара , но я не использовал это лично.
источник
Похоже, реклама LXML здесь. ;) ElementTree включен в библиотеку std. Под 2.6 и ниже его xpath довольно слаб, но в 2.7+ значительно улучшен :
источник
Используйте LXML. LXML использует всю мощь libxml2 и libxslt, но заключает их в более «Pythonic» привязки, чем в привязки Python, которые являются родными для этих библиотек. Таким образом, он получает полную реализацию XPath 1.0. Native ElemenTree поддерживает ограниченное подмножество XPath, хотя оно может быть достаточно для ваших нужд.
источник
Другой вариант - py-dom-xpath , он работает без проблем с minidom и является чистым Python, поэтому работает на appengine.
источник
context
infind
позволяет вам использовать другой результат xpath в качестве нового контекста поиска.Ты можешь использовать:
PyXML :
libxml2 :
источник
ImportError: No module named ext
отfrom xml.dom.ext.reader import Sax2
Последняя версия elementtree очень хорошо поддерживает XPath. Не будучи экспертом по XPath, я не могу точно сказать, является ли реализация полной, но она удовлетворила большинство моих потребностей при работе в Python. Я также использую lxml и PyXML и нахожу этри хорошим, потому что это стандартный модуль.
ПРИМЕЧАНИЕ: с тех пор я нашел lxml и для меня это определенно лучшая библиотека XML для Python. Он также хорошо работает с XPath (хотя, возможно, не полная реализация).
источник
Вы можете использовать простой
soupparser
изlxml
Пример:
источник
Если вы хотите использовать возможности XPATH в сочетании с возможностью использовать CSS в любой момент, вы можете использовать
parsel
:источник
//li/a/text()
Другая библиотека - 4Suite: http://sourceforge.net/projects/foursuite/
Я не знаю, насколько это соответствует спецификации. Но это сработало очень хорошо для моего использования. Это выглядит заброшенным.
источник
PyXML работает хорошо.
Вы не сказали, какую платформу вы используете, однако, если вы используете Ubuntu, вы можете получить ее
sudo apt-get install python-xml
. Я уверен, что другие дистрибутивы Linux также есть.Если вы работаете на Mac, xpath уже установлен, но не доступен сразу. Вы можете установить
PY_USE_XMLPLUS
в своей среде или сделать это Python, прежде чем импортировать xml.xpath:В худшем случае вам, возможно, придется создать его самостоятельно. Этот пакет больше не поддерживается, но все еще прекрасно работает и работает с современными 2.x Pythons. Основные документы здесь .
источник
Если вам понадобится html :
источник