2014-10-30 78 views
2

我的頁面返回JSON HTTP響應,其中包含id:14如何從JSON中抓取python

有沒有一種方法在硒python搶這個?我搜索了網頁並找不到任何解決方案。現在我想知道也許它不可能?我可以從數據庫中獲取這個ID,但我試圖避免這種情況。請告訴我,如果有任何方法。謝謝

+0

您可以使用'driver.page_source'看到頁面的源代碼。但是,如果響應的格式是純JSON,是否有必要使用Selenium?或者你可以使用更輕的東西(例如'request','urllib2'等等)? – 2014-10-30 19:49:45

+0

硒在這裏是必要的,因爲我正在運行一個測試和它的基於硒,需要變量 – Nro 2014-10-31 15:36:19

回答

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) 
+0

要求Python解析原始HTML不僅需要一個額外的第三方庫,但相比只讓瀏覽器執行解析。 – 2016-01-27 20:17:29

6

你的困難的根源是,當瀏覽器返回的原始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" 
} 

但實際上火狐(和Chrome)已結束了JSON在一點額外的HTML爲了創建一個它可以實際顯示的文檔。下面是Firefox的包裝它,我可以通過評估表達document.documentElement.innerHTML見右圖在JavaScript控制檯中的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並將生成的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

這顯然是一個更好的解決方案!附:愛你的PyCon視頻布蘭登 – RobinL 2016-01-28 09:37:46