Voglio solo scaricare questo URL & # 8230; ma mi sta dando un errore! & # 8230; unicode .. (Python)
Domanda
theurl = 'http://bit.ly/6IcCtf/'
urlReq = urllib2.Request(theurl)
urlReq.add_header('User-Agent',random.choice(agents))
urlResponse = urllib2.urlopen(urlReq)
htmlSource = urlResponse.read()
if unicode == 1:
#print urlResponse.headers['content-type']
#encoding=urlResponse.headers['content-type'].split('charset=')[-1]
#htmlSource = unicode(htmlSource, encoding)
htmlSource = htmlSource.encode('utf8')
return htmlSource
Dai un'occhiata alla parte Unicode. Ho provato quelle due opzioni ... ma non funziona.
htmlSource = htmlSource.encode('utf8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 370747: ordinal not in range(128)
e anche questo quando provo il metodo più lungo di codifica ...
_mysql_exceptions.Warning: Incorrect string value: '\xE7\xB9\x81\xE9\xAB\x94...' for column 'html' at row 1
Soluzione
I tuoi dati html sono una stringa che proviene da Internet già codificata con una certa codifica. Prima di codificarlo in utf-8
, devi decodificarlo prima .
Python è implicity cercando di decodificarlo (ecco perché ottieni un UnicodeDecodeError
non UnicodeEncodeError
).
Puoi risolvere il problema decodifica esplicita del tuo bytestring (usando la codifica appropriata) prima di provare a ricodificarlo in utf-8
.
Esempio:
utf8encoded = htmlSource.decode('some_encoding').encode('utf-8')
Utilizza la codifica corretta la pagina è stata codificata in primo luogo, anziché 'some_encoding'
.
Devi sapere quale codifica sta usando una stringa prima di poterla decodificare.
Altri suggerimenti
Non decodificare? htmlSource = htmlSource.decode ('utf8')
decodifica media " decodifica htmlSource dalla codifica utf8 "
codifica media " codifica htmlSource in codifica utf8 "
poiché si stanno estraendo i dati esistenti (ricerca per indicizzazione dal sito Web), è necessario decodificarli e quando si inserisce in mysql, potrebbe essere necessario codificare come utf8 in base alle regole di confronto mysql db / table / fields.
Probabilmente vuoi decodificare Utf8, non codificare :
htmlSource = htmlSource.decode('utf8')