【问题标题】:Why won't Python display this text correctly? (UTF-8 Decoding Issue)为什么 Python 不能正确显示此文本? (UTF-8 解码问题)
【发布时间】:2012-05-04 19:31:41
【问题描述】:
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 并且上面的替换代码没有改变任何东西。关于我做错了什么有什么建议吗?

【问题讨论】:

  • 你试过使用unicode字面量吗?
  • 我不完全确定你的意思,你能提供更多信息吗?
  • 不是',而是(U+2019,右单引号)。
  • 看到你正在使用urllib.request,我想你正在使用 Python 3。
  • 是的,使用 Python 3在区域变量中找到该字符串,即使在调用 print 函数时它正在屏幕上打印它。

标签: python html utf-8 python-3.x


【解决方案1】:

当您调用con.text() 时,这将返回一个bytes 对象。在其上调用str() 会返回它的表示 字符串-因此,如果您未指定编码,则使用转义符而不是真实字符。 (这意味着你的字符串最终会包含\\xe2\\x80\\x99 以及各种其他不想要的东西。)bytes 很像 Python 2 中的str:它没有存储任何编码信息。 Python 3 中的 str 类似于 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' 的规范。

【讨论】:

  • 感谢您的帮助,我最初尝试使用类似的方法来解码文件: page = con.read() newpage = page.decode('utf-8')作业,但在这里给了我一个空白页。然后我发现通过删除解码行我可以让它返回源代码,所以我才开始使用它。不知道发生了什么,再次感谢您的帮助。 :)
  • 基本上,str(b'\xab') 产生"b'\\xab'" 而不是'\xab' (相当于`repr(b'\xab') 因为没有指定就没有有意义的转换编码)。
【解决方案2】:

试试这个

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"YOUR_UNICODE_STRING","'")

例如

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

更多帮助请阅读本文

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

【讨论】:

  • 您的答案不正确,因为他正在处理的是 Python 3。
猜你喜欢
  • 2016-03-29
  • 2017-10-27
  • 1970-01-01
  • 2011-03-29
  • 2014-02-11
  • 2018-03-08
  • 1970-01-01
  • 2017-08-05
相关资源
最近更新 更多