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.
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êtesDécodent automatiquement le contenu du serveur [as
r.text
]. ... Vous pouvez également accéder au corps de la réponse sous forme d'octets [asr.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.