重音字符的另一个编码问题(使用Python和BeautifulSoup抓取网站)

时间:2017-02-01 23:44:58

标签: python unicode utf-8 character-encoding beautifulsoup

(前言:我知道,这个问题已被谈了一百次,但我仍然不明白)

我正在尝试加载一个html页面并输出文本,即使我正确地获取了网页,BeautifulSoup也会以某种方式破坏重音字符的编码,这些字符不是前127个ASCII字符的一部分:

# -*- coding: utf-8 -*-
import sys
from urllib import urlencode
from urlparse import parse_qsl
import re
import urlparse
import json
import urllib
from bs4 import BeautifulSoup

url = "http://www.rtve.es/alacarta/interno/contenttable.shtml?ctx=29010&locale=es&module=&orderCriteria=DESC&pageSize=15&mode=TEXT&seasonFilter=40015"
html=urllib2.urlopen(url).read()
soup = BeautifulSoup(html)
div = soup.find_all("span", class_="detalle")
capitulo_detalle = div[0].text   (doesn't work, capitulo_detalle is type str with utf-8, div[0].tex is type unicode)

div[0].text的输出应该是这样的:

S á tur se dirige al sur en busca de Estuarda y Gabi,pero un compa ñ ero de viaje inesperado har á que cambie de rumbo。 Los hombres de Juan siguen presos。 El enemigo comienza a realizar ejecuciones。 Á guila Roja tiene ...

但我得到的结果是:

u'S \ xe1tur se dirige al sur en busca de Estuarda y Gabi,pero un compa \ xf1ero de  viaje inesperado har \ xe1 que cambie de rumbo。 Los hombres de Juan siguen presos 。 El enemigo comienza a realizar ejecuciones。 \ xc1guila Roja tiene ...'

- >我需要更改什么才能获得“正确”的字符?

我知道它必须与这些问题重复,但答案似乎不适用于此: Python and BeautifulSoup encoding issues How to correctly parse UTF-8 encoded HTML to Unicode strings with BeautifulSoup?

我还阅读了有关unicode,utf-8,ascii的典型文档,例如: https://docs.python.org/3/howto/unicode.html,显然没有成功......

2 个答案:

答案 0 :(得分:0)

我相信我终于明白了......

>>> div = soup.find("span", class_="detalle")
>>> div.text
u'S\xe1tur se dirige al sur en busca de Estuarda y Gabi, pero

--->这是unicode,\ xe1是'á'(http://www.utf8-chartable.de/unicode-utf8-table.pl?start=4096&number=128&names=-&utf8=string-literal)的'代码'

>>> print(div.text)
Sátur se dirige al sur en busca de Estuarda y Gabi, pero

---> 'print'正确评估unicode代码点

>>> div.text.encode('utf-8')
'S\xc3\xa1tur se dirige al sur en busca de Estuarda y Gabi, pero

--->根据上面引用的URL给出的表格,Unicode被编码为utf-8。我不明白为什么输出显示为\ xc3 \ xa1而不是'á'。

>>> print div.text.encode('utf-8')
Sátur se dirige al sur en busca de Estuarda y Gabi, pero

--->我不明白为什么印刷现在将它评估为一个奇怪的符号......

>>> blurr = div.text.encode('cp850')
>>> blurr
'S\xa0tur se dirige al sur en busca de Estuarda y Gabi, pero
>>> type(blurr)
<type 'str'>

---&GT; Unicode编码到代码页850,在Windows下的python-shell中使用

>>> print(blurr)
Sátur se dirige al sur en busca de Estuarda y Gabi, pero

---&GT;最后,这是对的!

在Kodi我可以使用utf-8表示,例如字符“á”在变量中保存为\ xc3 \ xa1,但是当显示变量的内容时,例如“xbmcgui.Dialog()。ok(addonname,blurr)”,它会在屏幕上正确显示'A' ......

Und sowas soll man wissen ......

答案 1 :(得分:-1)

import requests
from bs4 import BeautifulSoup

url = "http://www.rtve.es/alacarta/interno/contenttable.shtml?ctx=29010&locale=es&module=&orderCriteria=DESC&pageSize=15&mode=TEXT&seasonFilter=40015"
html=requests.get(url)
soup = BeautifulSoup(html.text, 'lxml')
div = soup.find("span", class_="detalle")
capitulo_detalle = div.text 

出:

'Sátur se dirige al sur en busca de Estuarda y Gabi, pero un compañero de viaje inesperado hará que cambie de rumbo. Los hombres de Juan siguen presos. El enemigo comienza a realizar ejecuciones. Águila Roja tiene...'

使用requestspython3,问题永远不会出现