есть ли библиотека, которая может дать мне XPATH для всех узлов на странице HTML?
Получить XPATH для всех узлов
Ответ 1
есть ли библиотека, которая может дать мне XPATH для всех узлов на странице HTML
Да, если эта HTML-страница является хорошо сформированным XML-документом.
В зависимости от того, что вы понимаете под "node"...
//*
выбирает все элементы в документе.
/descendant-or-self::node()
выбирает все элементы, текстовые узлы, инструкции по обработке, узлы комментариев и корень node /
.
//text()
выбирает все текстовые узлы в документе.
//comment()
выбирает все узлы комментариев в документе.
//processing-instruction()
выбирает все инструкции обработки в документе.
//@*
выбирает все атрибутные узлы в документе.
//namespace::*
выбирает все узлы пространства имен в документе.
Наконец, вы можете комбинировать любое из приведенных выше выражений, используя оператор union (|
).
Таким образом, я считаю, что следующее выражение действительно выбирает "все узлы" любого документа XML:
/descendant-or-self::node() | //@* | //namespace::*
Ответ 2
Если это полезно для кого-то другого, если вы используете python/lxml, сначала нужно иметь дерево, а затем запросить это дерево с путями XPATH, которые перечислены выше в Dimitre.
Чтобы получить дерево:
import lxml
from lxml import html, etree
your_webpage_string = "<html><head><title>test<body><h1>page title</h3>"
bad_html = lxml.html.fromstring(your_webpage_string)
good_html = etree.tostring(root, pretty_print=True).strip()
your_tree = etree.fromstring(good_html)
all_xpaths = your_tree.xpath('//*')
В последней строке замените '//*' на любой xpath, который вы хотите. all_xpaths
теперь представляет собой список, который выглядит следующим образом:
[<Element html at 0x7ff740b24b90>,
<Element head at 0x7ff740b24d88>,
<Element title at 0x7ff740b24dd0>,
<Element body at 0x7ff740b24e18>,
<Element h1 at 0x7ff740b24e60>]