XPath总是返回空列表

时间:2019-12-23 07:47:05

标签: python python-3.x xpath python-requests lxml

我正在尝试从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中获取时间戳值?

2 个答案:

答案 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中,这是一个类似的过程。