我的页面返回包含id:14
的JSON http响应有没有办法在selenium python中抓住这个?我搜索了网络,找不到任何解决方案。现在我想知道它可能不可能吗?我可以从数据库中获取此ID,但我试图避免这种情况。请告诉我是否有任何方法。谢谢
答案 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()