簡體   English   中英

如何在 selenium python 中從 JSON 中抓取

[英]how to grab from JSON in selenium python

我的頁面返回包含 id: 14 的 JSON http 響應

selenium python 有沒有辦法抓住這個? 我在網上搜索,找不到任何解決方案。 現在我想知道也許它只是不可能? 我可以從數據庫中獲取這個 id,但我試圖避免這種情況。 請告訴我是否有任何解決辦法。 謝謝

您遇到困難的根源在於,當瀏覽器返回原始 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)

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

其他解決方案對我不起作用。 我發現這個使用requests解決方案requests快速又簡單:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM