tutorial tag parser library python html unicode web-scraping lxml

python - tag - El raspado de HTML usando lxml y las solicitudes da un error de Unicode



django beautifulsoup (1)

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 [como r.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.