python - tag - El raspado de HTML usando lxml y las solicitudes da un error de Unicode
django beautifulsoup (1)
Esta pregunta ya tiene una respuesta aquí:
Estoy tratando de usar un raspador de HTML como el que se proporciona here . Funciona bien para el ejemplo que proporcionan. Sin embargo, cuando trato de usarlo con mi página web , recibo este error: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
He intentado googlear, pero no pude encontrar una solución. Realmente apreciaría cualquier ayuda. Me gustaría saber si hay una manera de copiarlo como HTML usando Python.
Editar:
from lxml import html
import requests
page = requests.get(''http://cancer.sanger.ac.uk/cosmic/gene/analysis?ln=PTEN&ln1=PTEN&start=130&end=140&coords=bp%3AAA&sn=&ss=&hn=&sh=&id=15#'')
tree = html.fromstring(page.text)
Gracias.
Respuesta corta: use page.content
, no page.text
.
De http://lxml.de/parsing.html#python-unicode-strings :
los analizadores en lxml.etree pueden manejar cadenas de Unicode de inmediato ... Sin embargo, esto requiere que las cadenas de Unicode no especifiquen una codificación conflictiva por sí mismas y, por lo tanto, mienten acerca de su codificación real.
De http://docs.python-requests.org/en/latest/user/quickstart/#response-content :
Las solicitudes decodificarán automáticamente el contenido del servidor [como
r.text
]. ... También puede acceder al cuerpo de la respuesta como bytes [comor.content
].
Así que ya ves, tanto requests.text
como lxml.etree
quieren decodificar el utf-8 a Unicode. Pero si dejamos que requests.text
haga la decodificación, entonces la declaración de codificación dentro del archivo xml se convierte en una mentira.
Por lo tanto, vamos a tener requests.content
no decodificar. De esa manera, lxml
recibirá un archivo no lxml
manera consistente.