我正在尝试从网上抓取一篇文章并将其写入数据库。
如果我这样做
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'),这不起作用,错误仍然存在。答案 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