Разбор ответа в питоне - PullRequest
0 голосов
/ 28 ноября 2011

Когда я посылаю некоторые данные на хост:

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

но я хочу что-то вроде этого:

<html><h1>bla bla bla</h1></html>

Как я могу это сделать?

1 Ответ

3 голосов
/ 28 ноября 2011

Ответ, который вы получите, скорее всего, закодирован в 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)

Теперь просто найдите, какую часть модели вы хотите извлечь. Учитывая ваш пример и вы хотите распечатать раздел с помощью «blabla», вы можете написать:

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

Для отладки попробуйте:

print result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...