Проблемы с анализом JSON, который читается с URL - PullRequest
3 голосов
/ 26 февраля 2012

У меня проблема, которая, как мне кажется, имеет простое решение.

Я пишу скрипт Python, который читает строку JSON из URL-адреса и анализирует ее.Для этого я использую urllib2 и simplejson.

Проблема, с которой я столкнулся, связана с кодированием.URL, с которого я читаю, явно не указывает, в какой кодировке он находится (насколько я могу судить), и возвращает некоторые исландские символы.Я не могу выдать URL, который я читаю отсюда, но я установил пример файла данных JSON на своем собственном сервере, и у меня также возникают проблемы с чтением этого.Вот файл: http://haukurhaf.net/json.txt

Это мой код:

# coding: utf-8
#!/usr/bin/env python
import urllib2, re, os
from BeautifulSoup import BeautifulSoup
import simplejson as json

user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3'

def fetchPage(url):
    req = urllib2.Request(url)
    req.add_header('User-Agent', user_agent)
    response = urllib2.urlopen(req)
    html = response.read()
    response.close()
    return html

html = fetchPage("http://haukurhaf.net/json.txt")
jsonData = json.JSONDecoder().decode(html)

Синтаксический анализатор JSON выдает следующее сообщение об ошибке: UnicodeDecodeError: кодек «utf8» не может декодировать байт 0xe1 впозиция 35: недопустимый байт продолжения

Поскольку у меня нет никакого контроля над сервером, который хранит данные JSON, я не могу контролировать, какие заголовки кодирования он отправляет.Я надеюсь, что смогу как-то решить это со своей стороны.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 26 февраля 2012

Файл закодирован с использованием Latin-1, а не UTF-8, поэтому необходимо указать кодировку:

jsonData = json.JSONDecoder('latin1').decode(html)

Кстати: html - это недопустимое имя для документа JSON ...

1 голос
/ 26 февраля 2012

http://haukurhaf.net/json.txt

Этот ресурс кодируется как ISO-8859-1 или, что более вероятно, кодовая страница варианта Windows 1252. Это , а не UTF-8.

Вы можете прочитать его с помощью response.read().decode('cp1252'), чтобы получить строку Unicode, которую [simple]json также должен уметь анализировать.

Однако в байтовой форме JSON должен быть закодирован в UTF. Поэтому это недопустимый JSON, и он не будет работать, если вы попытаетесь загрузить его также из браузера.

0 голосов
/ 26 февраля 2012

Сначала вам нужно сделать строку в кодировке Unicode (сейчас это латинский-1):

uhtml = html.decode("latin-1")
jdata = json.loads(uhtml)

Или, если simplejson не имеет loads:

json.JSONDecoder().decode(uhtml)
...