XPath 总是 Returns 空列表

XPath Always Returns Empty List

我正在尝试从 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)

结果:

[]

如何在上述页面的 "Option Chain" 选项卡和特定的 xpath 中获取时间戳值?

您返回的结果是空的,因为如果您检查正在获取的 URL 的页面源,equity-derivative-op-timeStamp 时间戳是空的:

<span id="equity-derivative-op-timeStamp" class="asondate"></span>

该数据在页面加载后通过 Javascript 填充。您将无法使用 requests 模块获取它;你需要使用像 selenium 这样的东西来驱动能够处理 javascript.

的真实浏览器

正如 larsks 在他的回答中所说

That data is populated via Javascript after the page loads.

但数据是作为 XHR 加载的。在 Firefox 中右键单击页面,select Inspect Element select Network,select XHR,刷新页面右键单击感兴趣的请求并在新选项卡中打开它。

我确定您可能对 https://beta.nseindia.com/api/option-chain-indices?symbol=NIFTY 页面感兴趣。这是一个 JSON 文件。你可以像任何 JSON object:

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

您需要为上述特定请求提供 header。要确定 Firefox 中特定 web-page 需要哪些 headers,请右键单击页面,select 检查元素 select 网络刷新页面,右键单击您想要的请求select Copy 然后 Copy as cURL 将您复制的内容粘贴到 https://curl.trillworks.com 然后使用生成的代码,如果有效,一次删除 headers 直到您得到一个有效的最小集合。在 Chrome 中也是类似的过程。