https://next.newsimpact.com/NewsWidget/Live
我正在尝试编写一个python脚本,该脚本将从上面链接中的HTML表中获取值。上面的链接是我试图从中获取的网站,这是我编写的代码。我认为可能我的XPath不正确,因为它在其他元素上做得很好,但我正在使用的路径没有返回/打印任何东西。
from lxml import html
import requests
page = requests.get('https://next.newsimpact.com/NewsWidget/Live')
tree = html.fromstring(page.content)
#This will create a list of buyers:
value = tree.xpath('//*[@id="table9521"]/tr[1]/td[4]/text()')
print('Value: ', value)
奇怪的是,当我打开视图源代码页时,我无法找到我想要提取的表。 谢谢你的帮助!
答案 0 :(得分:1)
您的问题很简单,request
根本不处理javascript。这些值是JS生成的!
如果你真的需要运行这个xpath,你需要使用一个能够理解JS的模块,比如spynner。
您可以首先使用curl或在浏览器中禁用JS来测试何时需要JS。在导航栏中使用firefox:about:config
,然后搜索javascript.enabled
,然后双击它以在true或false之间切换
在chrome中,打开chrome dev工具,可以选择某处。
检查https://github.com/makinacorpus/spynner
另一个(可能的)问题,请使用tree = html.fromstring(page.text)
而不是tree = html.fromstring(page.content)
答案 1 :(得分:1)
初始页面源中缺少必需的数据 - 它来自XHR。你可以得到如下:
import requests
response = requests.get('https://next.newsimpact.com/NewsWidget/GetNextEvents?offset=-120').json()
first_previous = response['Items'][0]['Previous'] # Current output - "2.632"
second_previous = response['Items'][1]['Previous'] # Currently - "0.2"
first_forecast = response['Items'][0]['Forecast'] # ""
second_forecast = response['Items'][1]['Forecast'] # "0.3"
您可以将response
解析为简单的Python dict并获取所有必需的数据