2016-05-16 9 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 

を、それは無効な式のエラーを回避するのに役立つだろうが、あなたは表現によって発見何も得るでしょう。これは、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

ありがとう:uはすべてのhref取りたい場合は は、あなたのXPathは

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

様または1行にする必要があります!私はresponse.content.decode( 'utf-8')を動作させる必要がありました。 – Bastien

0

Uは、XPathを作る際に間違っていました。

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