2011-11-27 198 views
0

當我發送主機上的一些數據:解析響應

r = urllib2.Request(url, data = data, headers = headers) 
page = urllib2.urlopen(r) 

soup = BeautifulSoup(page.read(), fromEncoding="cp-1251") 
print page.read() 

我有這樣的事情:

[{"command":"settings","settings":{"basePath":"\/","ajaxPageState":{"theme":"spsr","theme_token":"kRHUhchUVpxAMYL8Y8IoyYIcX0cPrUstziAi8gSmMYk","css":[]},"ajax":{"edit-submit":{"callback":"spsr_calculator_form_ajax","wrapper":"calculator_form","method":"replaceWith","event":"mousedown","keypress":true,"url":"\/ru\/system\/ajax","submit":{"_triggering_element_name":"submit"}}}},"merge":true},{"command":"insert","method":null,"selector":null,"data":"\u003cdiv id=\"calculator_form\"\u003e\u003cform action=\"\/ru\/service\/calculator\" method=\"post\" id=\"spsr-calculator-form\" accept-charset=\"UTF-8\"\u003e\u003cdiv\u003e\u003cinput id=\"edit-from-ship-region-id\" type=\"hidden\" name=\"from_ship_region_id\" value=\"\" \/\u003e\n\u003cinput type=\"hidden\" name=\"form_build_id\" value=\"form-0RK_WFli4b2kUDTxpoqsGPp14B_0yf6Fz9x7UK-T3w8\" \/\u003e\n\u003cinput type=\"hidden\" name=\"form_id\" value=\"spsr_calculator_form\" \/\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"bg_p\"\u003e \n\u0421\u0435\u0439\u0447\u0430\u0441 \u0412\u044b... bla bla bla 

,但我想有一些,像這樣:

​​

我該怎麼辦?

+2

如何添加一些標記和文字標題詞來表示你實際在做什麼(不是簡單的「在python中解析響應」,這比你的實際問題更通用)。此外,請格式化您的第二個代碼塊以使用多行而不是一個連接。 –

+0

你執行過你的例子嗎?你打電話給page.read()兩次,這在我看來毫無意義。你在用湯做什麼?這根本不用?! – Achim

+0

與@achim一致認爲這裏有些問題。你真的在調用JSON嗎?或者你應該只是打印湯,而不是page.read()。無論哪種方式會引導你在一個更好的路線比當前的 – alonisser

回答

3

你得到的答案很可能是用JSON編碼的。如果這是真的,那麼使用BeautifulSoup沒有任何意義(它是一個HTML/XML解析器)。如果您有JSON數據,則需要使用JSON解析器。撥打page.read()兩次也沒有任何意義,因爲在第一次通話後它不會讓你恢復正常。

重寫你的要求的一部分,我們得到:

r = urllib2.Request(url, data = data, headers = headers) 
page = urllib2.urlopen(r) 
data = page.read() 

現在,而不是一個HTML解析器,我們需要使用JSON解析器。這可以用json庫(在Python 2.6以來)完成:

import json 
decoded_data = json.loads(data) 

現在,只需找到您要提取該模型的一部分。考慮到你的例子,給你想打印出來的部分與「布拉布拉」,你可以這樣寫:

result = unicode(decoded_data[1][u'data']) 

爲了調試試:

print result 
+2

不使用json - 使用simplejson。請勿使用urllib2使用請求。更好的python庫的工作 – alonisser