Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 3, 2014 16:13:28

gelius
Зарегистрирован: 2013-03-18
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

lxml.etree.XPathEvalError: Invalid expression

В 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
Вот что не так?

Офлайн

#2 Окт. 3, 2014 16:32:16

bica
Зарегистрирован: 2014-04-09
Сообщения: 2
Репутация: +  2  -
Профиль   Отправить e-mail  

lxml.etree.XPathEvalError: Invalid expression

test = text.xpath('//s[@class="test"]')

Офлайн

#3 Окт. 3, 2014 16:55:26

gelius
Зарегистрирован: 2013-03-18
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

lxml.etree.XPathEvalError: Invalid expression

Кстати, почему 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” выводит нормальный список. Например ссылки отображаются как ссылки.

Офлайн

#4 Окт. 4, 2014 00:54:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

lxml.etree.XPathEvalError: Invalid expression

gelius
Кстати, почему print выводит такую байду:
Какой print?



Офлайн

#5 Окт. 4, 2014 01:14:54

gelius
Зарегистрирован: 2013-03-18
Сообщения: 125
Репутация: +  0  -
Профиль   Отправить e-mail  

lxml.etree.XPathEvalError: Invalid expression

Когда я собираю ссылки так:

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>]
Не понимаю в чем разница, и что делать с таким списком во втором случае.

Офлайн

#6 Окт. 4, 2014 03:07:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9795
Репутация: +  849  -
Профиль   Отправить e-mail  

lxml.etree.XPathEvalError: Invalid expression

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() - выполнить функцию взятия текста



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version