Le raclage HTML à l'aide de lxml et de requêtes donne une erreur unicode [dupliquer]

Cette question a déjà une réponse ici:

J'essaie d'utiliser HTML scraper comme celui fourni ici . Cela fonctionne bien pour l'exemple qu'ils ont fourni. Cependant, lorsque j'essaie de l'utiliser avec mon page, je reçois cette erreur - Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration. J'ai j'ai essayé de googler mais je n'ai pas trouvé de solution. Je serais vraiment reconnaissant de toute aide. J'aimerais savoir s'il existe un moyen de le copier en HTML en utilisant Python.

Modifier:

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)

Je vous Remercie.

21
demandé sur user3783999 2014-07-29 23:15:15

1 réponses

Réponse courte: utilisez page.content, pas page.text.

À Partir de http://lxml.de/parsing.html#python-unicode-strings :

Les analyseurs dans lxml.etree peut gérer les chaînes unicode tout de suite ... Cela nécessite, cependant, que les chaînes unicode ne spécifient pas elles-mêmes un codage conflictuel et mentent donc sur leur codage réel

À Partir de http://docs.python-requests.org/en/latest/user/quickstart/#response-content :

Les requêtes

Décodent automatiquement le contenu du serveur [as r.text]. ... Vous pouvez également accéder au corps de la réponse sous forme d'octets [as r.content].

Donc vous voyez, les deux requests.text et lxml.etree veulent décoder l'utf-8 en unicode. Mais si nous laissons requests.text faire le décodage, puis l'encodage dans le fichier xml devient un mensonge.

Alors, faisons en sorte que requests.content ne fasse pas de décodage. De cette façon, lxml recevra un fichier non codé de manière cohérente.

52
répondu Robᵩ 2014-10-02 15:19:39