为什么Python不能正确显示此文本?(UTF-8解码问题)

2024-05-06 23:10:37 发布

您现在位置:Python中文网/ 问答频道 /正文

import urllib.request as u

zipcode = str(47401)
url = 'http://watchdog.net/us/?zip=' + zipcode
con = u.urlopen(url)

page = str(con.read())
value3 = int(page.find("<title>")) + 7
value4 = int(page.find("</title>")) - 15
district = str(page[value3:value4])
print(district)
newdistrict = district.replace("\xe2\x80\x99","'")
print(newdistrict)

出于某种原因,我的代码以以下格式拉入标题:IN-09: Indiana\xe2\x80\x99s 9th。我知道\xe字符串对于'符号是unicode,但是我不知道如何让python用'符号替换这组字符。我试过对字符串进行解码,但它已经是unicode格式,上面的替换代码没有任何改变。关于我做错什么有什么建议吗?


Tags: urltitlepagefindconintxe2zipcode
2条回答

当您调用con.text()时,这将返回一个bytes对象。对其调用str()将返回其表示形式的字符串-因此,如果不指定编码,则使用转义符而不是实际字符。(这意味着您的字符串最终包含\\xe2\\x80\\x99以及各种其他不需要的内容。)bytes基本上类似于Python 2中的str:它没有存储任何编码信息。str在Python 3中类似于Python 2中的unicode;它具有编码。所以,当把一个bytes对象转换成一个str对象时,你需要告诉它它实际上是用什么编码的。在这种情况下,就是utf-8

与其在上面调用str(),不如使用bytes.decode;这是一样的,只是更整洁。

>>> import urllib.request as u
>>> zipcode = 47401
>>> url = 'http://watchdog.net/us/?zip={}'.format(zipcode)
>>> con = u.urlopen(url)
>>> page = con.read().decode('utf-8')
>>> page[page.find("<title>") + 7:page.find("</title>") - 15]
'IN-09: Indiana’s 9th'

这里所做的唯一功能更改是将bytes对象解码为'utf-8'的规范。

试试这个

newdistrict = district.encode("**THE_INPUT_STRING_ENCODING**").replace("\\xe2\\x80\\x99","'")

我想你用的是utf-8所以应该是这样的

newdistrict = district.encode("utf-8").replace("\\xe2\\x80\\x99","'")

但这不是使用unicode的正确原因。 一旦你的文本被导入到程序中,你就应该在所有地方使用unicode 除了当输出作为输出时应该考虑外部目的地

所以更好的办法是在脚本顶部加上一行

# -*- coding: utf-8 -*-

以utf-8形式读取输入

page = con.read().decode('utf-8')

然后做 newdistrict=district.replace(u“您的UNICODE字符串”,“'”)

例如

newdistrict = district.replace(u"דכעדחלגעדיל","'")

要获得更多帮助,请阅读此

http://docs.python.org/howto/unicode.html

相关问题 更多 >