Преобразование результатов поиска Google в JSON в Python 3.1 - PullRequest
2 голосов
/ 27 января 2010

Я пишу программу на Python, которая передает поисковый запрос в Google с помощью API поиска Google и загружает первые 10 результатов. Я смог сделать это в Python 2.6 следующим образом:

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false)
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
             % (query)
results = urllib.urlopen(url)
resultsjson = json.loads(results.read())
betterResults += resultsjson["responseData"]["results"]

Google search API возвращает результаты в виде json, поэтому я использовал приведенный выше код, чтобы загрузить результаты в json of my и разобрать их в список (betterResults).

Когда я переключился на Python 3, моя программа начала генерировать исключения. По-видимому, в Python 2.6 объект, возвращаемый функцией urlopen (), является файловым объектом, который может быть загружен в json. В Python 3.1 возвращаемый объект является объектом HTTPResponse, который содержит метод read (), как того требуют спецификации json, но является байтовым объектом. Поэтому я не смог получить доступ к информации, как в версии 2.6.

Есть ли способ получить доступ к json, возвращенному Google? Как я могу получить результаты в Python 3 и иметь возможность выбрать, какие поля я хочу, как я мог сделать с JSON?

Большое спасибо, BSG

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Вам нужно будет декодировать объект байта, если вы хотите использовать его с json.loads

resultjson =  json.loads(results.read().decode())

документы также предлагают передать параметр кодирования в функцию loads:

json.loads(results.read(), encoding=<encoding-type>)

Я думаю, что у Леннарта есть объяснение, как получить тип кодировки.

1 голос
/ 27 января 2010

Объект, возвращаемый urlopen - это файл , как будто вы не правы. Но вы используете json.loads (), которая ожидает строку. json.load () ожидает файл как объект.

Однако json.load () ожидает, что результатом метода read () будет строка, в то время как полученное вами чтение будет байтовым, поэтому вам нужно сначала декодировать его из байтов в строку.

Итак, как-то так:

query = urllib.parse.urlencode({'q' : 'searchterm','start' : k},doseq=false)
url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&%s' \
             % (query)
results = urllib.urlopen(url)
encoding = input.getheader('content-type').split('=')[-1]
resultsjson = json.loads(results.read().decode(encoding))
betterResults += resultsjson["responseData"]["results"]

Могу работать. (Я не проверял это).

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