2016-05-16 1 views
1

Я получаю сообщение об ошибке с Python, которое я не могу понять. Я упростил свой код на очень минимум:lxml.etree.XPathEvalError: Неверное выражение

response = requests.get('http://pycoders.com/archive') 
tree = html.fromstring(response.text) 
r = tree.xpath('//divass="campaign"]/a/@href') 
print(r) 

и все еще получаю ошибку

Traceback (most recent call last): 
File "ultimate-1.py", line 17, in <module> 
r = tree.xpath('//divass="campaign"]/a/@href') 
File "lxml.etree.pyx", line 1509, in lxml.etree._Element.xpath (src/lxml/lxml.etree.c:50702) 
File "xpath.pxi", line 318, in lxml.etree.XPathElementEvaluator.__call__ (src/lxml/lxml.etree.c:145954) 
File "xpath.pxi", line 238, in lxml.etree._XPathEvaluatorBase._handle_result (src/lxml/lxml.etree.c:144962) 
File "xpath.pxi", line 224, in lxml.etree._XPathEvaluatorBase._raise_eval_error (src/lxml/lxml.etree.c:144817) 
lxml.etree.XPathEvalError: Invalid expression 

ли кто-нибудь иметь представление о том, где проблема приходит? Может ли это быть проблемой зависимостей? Благодарю.

ответ

1

Выражение '//divass="campaign"]/a/@href' не является синтаксически правильным и не имеет большого смысла. Вместо того, чтобы вы имели в виду, чтобы проверить class атрибут:

//div[@class="campaign"]/a/@href 

Теперь, что помогло бы избежать Invalid ошибки Expression, но вы не получите ничего, найденное выражение. Это потому, что данных нет в ответе, который получает requests. Вам нужно будет подражать тому, что браузер делает для получения желаемых данных, и сделать дополнительный запрос на получение файла javascript, содержащего кампании.

Вот что работает для меня:

import ast 
import re 

import requests 
from lxml import html 

with requests.Session() as session: 
    # extract script url 
    response = session.get('http://pycoders.com/archive') 
    tree = html.fromstring(response.text) 
    script_url = tree.xpath("//script[contains(@src, 'generate-js')]/@src")[0] 

    # get the script 
    response = session.get(script_url) 
    data = ast.literal_eval(re.match(r'document.write\((.*?)\);$', response.content).group(1)) 

    # extract the desired data 
    tree = html.fromstring(data) 
    campaigns = [item.attrib["href"].replace("\\", "") for item in tree.xpath('//div[@class="campaign"]/a')] 
    print(campaigns) 

Печать:

['http://us4.campaign-archive2.com/?u=9735795484d2e4c204da82a29&id=3384ab2140', 
... 
'http://us4.campaign-archive2.com/?u=9735795484d2e4c204da82a29&id=8b91cb0481' 
] 
+0

Спасибо! Я должен был выполнить response.content.decode ('utf-8'), чтобы он работал. – Bastien

0

U был неправ в создании XPath. Если и хотите принять все hrefs ваш XPath должен быть как

hrefs = tree.xpath('//div[@class="campaign"]/a') 
for href in hrefs: 
    print(href.get('href')) 

или в одной строке:

hrefs = [item.get('href') for item in tree.xpath('//div[@class="campaign"]/a')] 

 Смежные вопросы

  • Нет связанных вопросов^_^