Python Unicode地狱:解码和编码不起作用

时间:2015-12-25 17:39:48

标签: python python-2.7 unicode encoding

我正在尝试从网上抓取一篇文章并将其写入数据库。

如果我这样做

article = article.decode('utf-8')

我明白了:

'ascii' codec can't decode byte 0xc3 in position 25729: ordinal not in range(128)

如果我这样做

article = article.encode('utf-8')

我明白了:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 5409: ordinal not in range(128)

如果我这样做

article = article.encode('utf-8').decode()

或者

article = article.decode().encode('utf-8')

我还是得到了这个

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 5409: ordinal not in range(128)

问题:

在解决这个问题时,我们将非常感谢您的帮助!

编辑:Stackoverflow推荐一篇文章说按照上面的说法做.encode('utf-8'),这不起作用,错误仍然存​​在。

4 个答案:

答案 0 :(得分:1)

如果你知道你做了什么,Unicode并不是一件痛苦的事。

如果我们尝试更系统的方法,并假设我们继续使用Python 2.x,我们必须明白我们从Web等获得的所有内容都包含字节,因此是str

str上,我们只能在.decode()对象上拨打unicode,我们只能拨打.encode()。 (这不是完全正确的,但是如果我们不遵循这一点,我们将失去对内部de / /编码的控制,这恰好可以弥补这种不匹配。)

示例:如果您

article = article.encode('utf-8')

你得到的UnicodeDecodeError代表'ascii' codec can't decode byte 0xc4 in position 5409: ordinal not in range(128)

我们看到虽然我们调用.encode(),但首先会发生 decode 错误。这是因为对.decode('ascii')的隐式调用失败,因为str中存在非ASCII字节。

但是,我不明白为什么

article = article.decode('utf-8')

给出

'ascii' codec can't decode byte 0xc3 in position 25729: ordinal not in range(128)

因为这里根本没有使用ascii编解码器。也许您可以编辑您的问题并在<{em>} print repr(article)来电之前添加.decode() 的输出,以便我们可以尝试复制此内容。

答案 1 :(得分:0)

在问题的行和OP自己的答案之间进行阅读,看起来原始网页的编码没有得到处理。

需要正确解码网页。这可以通过检查for (int i = 0; i < MainScript.Score.Length; i++) { MainScript.Score[i] = do something here... } 标头或使用为您完成此操作的HTTP库来实现。 Requests模块为您执行此操作并返回已解码的 Unicode对象。然后可以将此对象传递给TextWrappers(通过Content-type:),以便写入文件,数据库处理程序或BeautifulSoup进行解析。实际上,BeautifulSoup应该只传递Unicode字符串。

使用请求的示例:

io.open()

答案 2 :(得分:-2)

尝试使用utf 16代替。当上述情况发生时,这往往有助于解决我的问题。

     .decode('utf-16')

答案 3 :(得分:-2)

看起来解决方法是将其添加到代码

html = unicode(html, errors='ignore')

所以获得文章的完整代码看起来像这样

def getArticle(url):
    br = mechanize.Browser()
    br.set_handle_robots(False)
    br.addheaders = [("User-agent","Mozilla/5.0")] #our identity in the web
    html = br.open(url).read()

    html = unicode(html, errors='ignore')

    readable_article = Document(html).summary()
    readable_title = Document(html).short_title()

    soup = BeautifulSoup(readable_article)

    soup_title = BeautifulSoup(readable_title)

    final_article = soup.text
    final_title = soup_title.text

    links = soup.findAll('img', src=True)

    return html, final_article, final_title, links