Применение root.xpath () с регулярным выражением возвращает lxml.etree._ElementUnicodeResult - PullRequest
1 голос
/ 18 апреля 2019

Я создаю модель, чтобы узнать, где находится фрагмент текста в файле HTML.

Итак, у меня есть база данных с большим количеством данных из различных газетных статей с такими данными, как название, дата публикации, авторы и текст новостей. Я пытаюсь проанализировать эти данные и сгенерировать модель, которая сама может найти XPath для тегов HTML с этим содержимым.

Проблема в том, что я использую регулярное выражение в методе xpath, как показано здесь:

from lxml import html

with open('somecode.html', 'r') as f:
    root = html.fromstring(f.read())

list_of_xpaths = root.xpath('//*/@*[re:match(.,"2019-04-15")]')

Это пример поиска даты публикации в коде. Он возвращает lxml.etree._ElementUnicodeResult вместо lxml.etree._Element.

К сожалению, этот тип элемента не позволяет мне получить XPath, где он находится, как lxml.etree._Element после применения root.getroottree().getpath(list_of_xpaths[0]).

Есть ли способ получить XPath для этого типа элемента? Как?

Есть ли способ, чтобы lxml с помощью регулярного выражения вместо этого возвращал элемент lxml.etree._ElementUnicodeResult?

1 Ответ

1 голос
/ 18 апреля 2019

Проблема в том, что вы получаете значение атрибута , представленное как экземпляр класса _ElementUnicodeResult.

Если мы проанализируем, что обеспечивает класс _ElementUnicodeResult, мы можем увидеть, что он позволяетчтобы добраться до элемента, который имеет этот атрибут, с помощью .getparent() метода:

attribute = list_of_xpaths[0]
element = attribute.getparent()

print(root.getroottree().getpath(element))

Это даст нам путь к элементу, но, поскольку нам также нужно имя атрибута, мы можем сделать:

print(attribute.attrname) 

Затем, чтобы получить полный xpath, указывающий на атрибут элемента, мы можем использовать:

path_to_element = root.getroottree().getpath(element)
attribute_name = attribute.attrname

complete_path = path_to_element + "/@" + attribute_name
print(complete_path)

FYI, _ElementUnicodeResult также указывает, действительно ли это атрибутчерез свойство .is_attribute (так как этот класс также представляет текстовые узлы и хвосты).

...