如何在Selenium Python中从JSON中获取数据

7 投票
3 回答
26253 浏览
提问于 2025-04-30 17:11

我的页面返回了一个包含id: 14的JSON格式的响应。

请问在使用selenium的Python中,有办法获取这个id吗?我在网上搜索过,但没有找到任何解决方案。现在我在想,可能这根本就不可能?我可以从数据库中获取这个id,但我想避免这样做。请告诉我有没有其他方法。谢谢!

暂无标签

3 个回答

0

其他的解决办法对我来说都没用。我发现这个用 requests 的方法既快又简单:

import requests
requests.get(browser.current_url).json()
24

你遇到的问题是因为当浏览器收到原始的JSON数据时,它会在外面加上一点HTML,这样用户才能在屏幕上看到内容。

比如,当我在Firefox浏览器中访问https://httpbin.org/user-agent时,我在浏览器窗口中看到的原始JSON是这样的:

{"user-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0"
}

但实际上,Firefox(还有Chrome)在这个JSON外面加了一些额外的HTML,以便生成一个可以显示的文档。我可以通过在JavaScript控制台中输入document.documentElement.innerHTML来查看Firefox加的HTML内容:

<head><link rel="alternate stylesheet" type="text/css"
 href="resource://gre-resources/plaintext.css" title="Wrap Long Lines"></head>
 <body><pre>{"user-agent": "Mozilla/5.0 (X11; Linux x86_64; rv:42.0)
 Gecko/20100101 Firefox/42.0"
}
</pre></body>

使用BeautifulSoup来解析HTML,正如其他答案中提到的,有两个严重的缺点:首先,它会给你的项目增加一个新的依赖项,其次,相比于直接利用浏览器已经为你解析好的HTML,这种方法会比较慢。

如果你想让浏览器帮你提取JSON,只需请求它返回<body>元素中的文本,这样浏览器加的额外结构就会被排除,返回的就是纯粹的JSON:

driver.find_element_by_tag_name('body').text

或者,如果你想把它解析成Python的数据结构:

import json
json.loads(driver.find_element_by_tag_name('body').text)
6

你可以使用BeautifulSoup这个工具来解析网页,并提取出里面的json数据。你需要的代码大概是这样的。如果json数据不直接在响应的主体部分,你可能需要修改一下soup.find这个命令。

from bs4 import BeautifulSoup
import json

soup = BeautifulSoup(driver.page_source)
dict_from_json = json.loads(soup.find("body").text)

撰写回答