我正在尝试从this website中提取时间值。
下面是我正在使用的代码
import requests
from lxml import html
page = requests.get('https://beta.nseindia.com/get-quotes/derivatives?symbol=NIFTY&identifier=OPTIDXNIFTY26-12-2019CE12300.00')
tree = html.fromstring(page.content)
test1 = tree.xpath('//*[@id="equity-derivative-op-timeStamp"]/text()')
print(test1)
结果:
[]
如何在上一页的“选项链”选项卡以及特定的xpath中获取时间戳值?
答案 0 :(得分:1)
您返回一个空结果,因为如果您检查要获取的URL的页面源,则equity-derivative-op-timeStamp
时间戳为空:
<span id="equity-derivative-op-timeStamp" class="asondate"></span>
该数据在页面加载后通过Javascript填充。您将无法使用requests
模块来获取它;您将需要使用selenium之类的东西来驱动能够处理javascript的真实浏览器。
答案 1 :(得分:1)
如Larsks在他的回答中所说
页面加载后,数据将通过Javascript填充。
但是数据被加载为XHR。在Firefox中,右键单击页面,选择“检查元素”,选择“网络”,选择“ XHR”,刷新页面,右键单击感兴趣的请求,然后在新选项卡中将其打开。
这样做,我发现您可能对页面https://beta.nseindia.com/api/option-chain-indices?symbol=NIFTY感兴趣。这是一个JSON文件。您可以像使用任何JSON对象一样使用它:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0'
}
params = (
('symbol', 'NIFTY'),
)
response = requests.get('https://beta.nseindia.com/api/option-chain-indices', headers=headers, params=params)
j = response.json()
print(j['records']['timestamp'])
输出:
23-Dec-2019 15:30:00
您需要如上所述为该特定请求提供标头。要确定Firefox中特定网页需要哪些标题,请在页面上单击鼠标右键,选择“检查元素”,再选择“网络”,刷新页面,然后右键单击您要选择的请求,然后选择Copy
,然后Copy as cURL
粘贴您要的内容复制到https://curl.trillworks.com中,然后使用生成的代码,如果可以的话,一次删除一个标题,直到获得最小的有效集合。在Chrome中,这是一个类似的过程。