如何从selenium python中的JSON中获取

时间:2014-10-30 19:35:31

标签: python json selenium

我的页面返回包含id:14

的JSON http响应

有没有办法在selenium python中抓住这个?我搜索了网络,找不到任何解决方案。现在我想知道它可能不可能吗?我可以从数据库中获取此ID,但我试图避免这种情况。请告诉我是否有任何方法。谢谢

3 个答案:

答案 0 :(得分:9)

您遇到困难的根源在于,当浏览器返回原始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中,以便创建一个可以实际显示的文档。这是Firefox包含它的HTML,我可以通过评估表达式document.documentElement.innerHTML在JavaScript控制台中看到它:

<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,并准备好您使用的DOM。

要求浏览器为您提取JSON,只需询问<body>元素内的文本,并且将排除浏览器添加的所有额外结构,并返回纯JSON :

driver.find_element_by_tag_name('body').text

或者,如果您希望将其解析为Python数据结构:

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

答案 1 :(得分:1)

您可以使用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)

答案 2 :(得分:0)

其他解决方案对我不起作用。我发现这个使用 requests 的解决方案既快速又简单:

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