Найти - Пользователи
Полная версия: lxml.etree.XPathEvalError: Invalid expression
Начало » Python для новичков » lxml.etree.XPathEvalError: Invalid expression
1
gelius
В html есть такие строки:
<s class="test"><!--постоянно изменяющийся нужный текст--></s>
Делаю:
test = lxml.html.fromstring(html)
test = text.xpath('//s@[class="test"]')
Получаю:
  File "lxml.etree.pyx", line 1317, in lxml.etree._Element.xpath (src/lxml/lxml.etree.c:36891)
  File "xpath.pxi", line 290, in lxml.etree.XPathElementEvaluator.__call__ (src/lxml/lxml.etree.c:103188)
  File "xpath.pxi", line 212, in lxml.etree._XPathEvaluatorBase._handle_result (src/lxml/lxml.etree.c:102495)
  File "xpath.pxi", line 198, in lxml.etree._XPathEvaluatorBase._raise_eval_error (src/lxml/lxml.etree.c:102367)
lxml.etree.XPathEvalError: Invalid expression
Вот что не так?
bica
test = text.xpath('//s[@class="test"]')
gelius
Кстати, почему print выводит такую байду:
[<Element i at 18034c8>, <Element i at 1803530>, <Element i at 1803598>, <Element i at 1803600>, <Element i at 1803668>, <Element i at 18036d0>, <Element i at 1803738>, <Element i at 18037a0>, <Element i at 1803808>, <Element i at 1803870>, <Element i at 18038d8>, <Element i at 1803940>, <Element i at 18039a8>, <Element i at 1803a10>, <Element i at 1803a78>, <Element i at 1803ae0>, <Element i at 1803b48>, <Element i at 1803bb0>, <Element i at 1803c18>, <Element i at 1803c80>]
Везде print переменной “list” выводит нормальный список. Например ссылки отображаются как ссылки.
py.user.next
gelius
Кстати, почему print выводит такую байду:
Какой print?
gelius
Когда я собираю ссылки так:
urls = lxml.html.fromstring(html)
urls = urls.xpath(u'//img/ancestor::a[not(re:match(@href, "(slovo)")) ]/@href', namespaces={"re": "http://exslt.org/regular-expressions"})
print urls
Выводится список ссылок.
В таком случае:
test = lxml.html.fromstring(html)
test = test.xpath('//s@[class="test"]')
print test
Отдает вот это:
[<Element s at 18034c8>, <Element s at 1803530>, <Element s at 1803598>, <Element s at 1803600>, <Element s at 1803668>, <Element s at 18036d0>, <Element s at 1803738>, <Element s at 18037a0>, <Element s at 1803808>, <Element s at 1803870>, <Element s at 18038d8>, <Element s at 1803940>, <Element s at 18039a8>, <Element s at 1803a10>, <Element s at 1803a78>, <Element s at 1803ae0>, <Element s at 1803b48>, <Element s at 1803bb0>, <Element s at 1803c18>, <Element s at 1803c80>]
Не понимаю в чем разница, и что делать с таким списком во втором случае.
py.user.next
gelius
test = test.xpath('//s@[class="test"]')
Выше bica написал, куда @ поставить.
@ - at, сокращение от attribute

В квадратных скобках записывается условие, по которому нужно выбирать элементы из всего множества элементов.

test = test.xpath('//s[@class="test"]')
// - на любой глубине
s - элементы с именем s
[ - у которых
@ - атрибут
class - с именем class
= - равен
“test” - строке test

test = test.xpath('//s[@class="test"]/text()')
/ - и у этих элементов
text() - выполнить функцию взятия текста
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB