Есть ли способ вычислить XPath из известного значения на веб-странице? - PullRequest
0 голосов
/ 23 мая 2009

Как я понимаю, XPath - это способ навигации по элементам в документе XML.
Направление XPath -> element.
Как вы поступаете наоборот? То есть вычислить XPath из известного значения элемента?

Например, как вы можете найти xpath ссылки "faq" в заголовке stackoverflow?
Язык не так важен, меня больше интересуют алгоритм и / или библиотеки / методы, которые помогут мне вычислить XPath.

Ответы [ 3 ]

2 голосов
/ 23 мая 2009

Вот простая функция JS, чтобы сделать это. Он использует только previousSibling, nodeType и parentNode, поэтому он должен быть переносимым на другие языки. Тем не менее, результат не читается (для людей), и он не будет особенно устойчивым перед лицом изменений страницы.

По моему опыту, XPath более полезен, если написан от руки. Тем не менее, вы, безусловно, можете создать алгоритм, который будет генерировать более приятные (если, возможно, более медленные) результаты.

function getXPath(node)
{
    if(node == document)
    return "/";
    var xpath = "";
    while (node != null && node.nodeType != Node.DOCUMENT_NODE)
    {
    print(node.nodeType);
    var pos = 1, prev;
    while ((prev = node.previousSibling) != null)
    {
        node = prev
        pos++;
    }
    xpath = "/node()[" + pos + "]" + xpath;
    node = node.parentNode;
    }
    return xpath;
}
1 голос
/ 23 мая 2009

Вы не указали язык, на который сложно ответить на этот вопрос. Модуль Python lxml может сделать это

>>> a  = etree.Element("a")
>>> b  = etree.SubElement(a, "b")
>>> c  = etree.SubElement(a, "c")
>>> d1 = etree.SubElement(c, "d")
>>> d2 = etree.SubElement(c, "d")

>>> tree = etree.ElementTree(c)
>>> print(tree.getpath(d2))
/c/d[2]
>>> tree.xpath(tree.getpath(d2)) == [d2]
True

Даже если вы не используете python, вы можете найти то, что вам нужно, в исходном коде модуля

1 голос
/ 23 мая 2009

Поскольку XPath может выбрать n-й дочерний элемент (т. Е. / Parentelement / child_element [2]), если вы сможете выяснить, где в дереве находится элемент, то вы сможете сгенерировать XPath обратно к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...