2016-08-14 51 views
1

我试图让LXML打印在python的选择: http://imgur.com/a/joeql试图让LXML打印在python的具体数量

我的代码是不是很多,但在这里它是

from lxml import html 
import requests 


page = requests.get('https://www.pathofexile.com/forum/view-thread/1703834') 
tree = html.fromstring(page.content) 

winner = tree.xpath(//*[@id="eventView0"]/div[3]/table/tbody/tr[1]/td[7]) 

print,winner 
+0

什么具体是你遇到的问题/错误?换句话说,你预期的结果是什么,你得到的结果是什么? – rdgd

+0

我得到的具体一个是: winner = tree.xpath(// * [@ id =“eventView0”]/div [3]/table/tbody/tr [1]/td [7]) ^ 语法错误:无效语法 但是我甚至不确定我是否正确地解决了这个问题。 –

回答

1

你看到的语法错误是因为你没有包围的XPath字符串到报价,解决它:

winner = tree.xpath('//*[@id="eventView0"]/div[3]/table/tbody/tr[1]/td[7]') 

实际问题是表的内容是动态,通过形成在浏览器中执行的JavaScript。你可以做的是通过json.loads()解析script标签具有JSON对象中所需的数据,提取JSON字符串,并将其加载到Python数据结构:

import json 
import re 

from lxml import html 
import requests 


page = requests.get('https://www.pathofexile.com/forum/view-thread/1703834') 
tree = html.fromstring(page.content) 

script = tree.xpath('//script[contains(., "var json")]/text()')[0] 
obj_string = re.search(r"var json = (\{.*?\}),$", script, re.MULTILINE).group(1) 
obj = json.loads(obj_string) 

# print entries 
entries = obj['ladder']['entries'] 
for entry in entries: 
    print(entry['account']['name']) 

打印账户名(就像一个证明它正在工作):

Havoc6 
Steelmage 
Olecgolec 
... 
Anafobia 
nokieka2 
HoGji 
+0

这工作!不幸的是,因为我“有15名代表”,所以你看不到我的赞美! –

+0

我为你提高了AveryLipsit这应该是问题的接受答案。 @alecxe,你可以请编辑你的答案,包括我的答案关于语法错误,以便那些谁来寻找类似问题的答案会找到一个完整的答案? – rdgd

+0

谢谢rdgd,我刚刚接受了答案! –

1

语法错误意味着您正在编写无效的python,这并不一定意味着您的逻辑/方法有问题。

确保在用单引号调用tree.xpath内包围参数。

winner = tree.xpath('//*[@id="eventView0"]/div[3]/table/tbody/tr[1]/td[7]') 
+0

谢谢,现在错误消失了,但它仍然没有打印任何东西。它只是说“过程完成退出码0” –