Decodificación de entidades HTML con Python
-
06-07-2019 - |
Pregunta
El siguiente código de Python usa BeautifulStoneSoup para obtener la información de la API LibraryThing para Tolkien's " The Children of H & # 250; rin " ;.
import urllib2
from BeautifulSoup import BeautifulStoneSoup
URL = ("http://www.librarything.com/services/rest/1.0/"
"?method=librarything.ck.getwork&id=1907912"
"&apikey=2a2e596b887f554db2bbbf3b07ff812a")
soup = BeautifulStoneSoup(urllib2.urlopen(URL),
convertEntities=BeautifulStoneSoup.ALL_ENTITIES)
title_field = soup.find('field', attrs={'name': 'canonicaltitle'})
print title_field.find('fact').string
Desafortunadamente, en lugar de 'H & # 250; rin', imprime 'H & # 195; & # 186; rin'. Obviamente, este es un problema de codificación, pero no puedo resolver lo que necesito hacer para obtener el resultado esperado. La ayuda sería muy apreciada.
Solución
En la fuente de la página web se ve así: The Children of H & amp; Atilde; & amp; ordm; rin
. Entonces, la codificación ya está rota en algún lado de su lado antes de que incluso se convierta a XML ...
Si se trata de un problema general con todos los libros y necesita solucionarlo, parece funcionar:
unicode(title_field.find('fact').string).encode("latin1").decode("utf-8")
Otros consejos
La página web puede estar mintiendo sobre su codificación. La salida se parece a UTF-8. Si tiene un str al final, deberá decodificarlo como UTF-8. Si tiene un Unicode, deberá codificar primero como Latin-1.