Python et BeautifulSoup problèmes d'encodage
Je suis en train d'écrire un robot avec Python à l'aide de BeautifulSoup, et tout allait à merveille jusqu'à ce que je couru dans ce site:
Je suis de l'obtention du contenu à la demande de la bibliothèque:
r = requests.get('http://www.elnorte.ec/')
content = r.content
Si je fais une impression du contenu de la variable à ce stade, tous les espagnols caractères spéciaux semble fonctionner correctement. Cependant, une fois que j'ai essayer de nourrir le contenu de la variable à BeautifulSoup tout se foiré:
soup = BeautifulSoup(content)
print(soup)
...
<a class="blogCalendarToday" href="/component/blog_calendar/?year=2011&month=08&day=27&modid=203" title="1009 artÃculos en este dÃa">
...
C'est apparemment fausser tous les espagnols de caractères spéciaux (accents et autres joyeusetés). J'ai essayé de faire du contenu.decode('utf-8'), le contenu.decode ("latin-1"), a également essayé de déconner avec le fromEncoding paramètre de BeautifulSoup, la valeur fromEncoding='utf-8' et fromEncoding= "latin-1", mais toujours pas de dés.
Tous les pointeurs serait très apprécié.
Vous devez vous connecter pour publier un commentaire.
pourriez-vous essayer:
Je reçois le bon de sortie.
Oh, dans ce cas spécial, vous pouvez également
x.__str__(encoding='latin1')
.Je suppose que c'est parce que le contenu est en ISO-8859-1(5) et la meta http-equiv type de contenu de manière incorrecte dit "UTF-8".
Pourriez-vous confirmer?
BeatifulSoup
?): AttributeError: objet de type 'BeautifulSoup' n'a pas d'attribut "BeautifulSoup' - peut-être que l'interface a changé?file.write(str(x.prettify('latin-1')))
, elle s'affiche donc beaucoup de caractère générique comme\n
et de détruire la mise en forme. Aucune solution de contournement pour qui?Dans votre cas, cette page a de mauvaises données utf-8 qui confond BeautifulSoup et le fait qu'il pense que votre page utilise windows-1252, vous pouvez faire ce truc:
ce faisant, vous allez jeter le tort de symboles à partir de la source de la page et BeautifulSoup va deviner le codage correctement.
Vous pouvez remplacer "ignorer" par "remplacer" et vérifier le texte de '?' symboles pour voir ce qui a été mis au rebut.
En fait, c'est une tâche très dure à écrire robot qui peut deviner le codage de la page à chaque fois avec 100% de chance(les Navigateurs sont très bon à cela de nos jours), vous pouvez utiliser les modules comme "chardet", mais, par exemple, dans votre cas, il va deviner l'encodage ISO-8859-2, ce qui n'est pas correct aussi.
Si vous avez vraiment besoin pour être en mesure d'obtenir de l'encodage pour n'importe quelle page l'utilisateur peut éventuellement l'offre vous devez construire un multi-niveau(essayez de l'utf-8, essayez latin1, essayez etc...) de détection de la fonction(comme nous l'avons fait dans notre projet) ou d'utiliser certains de détection de code à partir de firefox ou de chrome en tant que module C.
Vous pouvez essayer ce qui fonctionne pour tous les encodages
headers
(pas vraiment nécessaire, et, puisque vous n'avez pas de définirUSERAGENT
le code ne peut pas être aveuglément copie-collé).La première réponse est juste, cette fonctions, à certains moments, sont effective.
Je vous suggère de prendre un plus méthodique infaillible approche.
Vous pouvez raison, peu importe ce que vous jeter sur ce, il envoie toujours valide unicode à bs.
Comme un résultat de votre analysé arbre se comporte beaucoup mieux et de ne pas échouer dans de nouveaux plus intéressant à chaque fois que vous avez de nouvelles données.
D'essai et d'Erreur ne fonctionne pas dans le Code - Il y a trop de combinaisons 🙂