【问题标题】:Python Unencode unicode html hexadecimalPython Unencode unicode html 十六进制
【发布时间】:2014-06-24 19:53:59
【问题描述】:

假设我有很多字符串,比如

“words words words

有没有办法通过python直接将这些转换成它们所代表的字符?

我试过了

h = HTMLParser.HTMLParser()
print h.unescape(x)

但出现此错误:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

我也试过

print h.unescape(x).encode(utf-8) 

但它编码

“â

什么时候应该是引号

【问题讨论】:

  • 是什么让您认为“ 应该是逗号?这是来自哪个网页?将它们转换为它们所代表的字符h.unescape(x) 这样做...但是当您尝试打印它时会出现问题...尝试查看它的 repr
  • 我说引号不是逗号。从上下文中可以清楚地看出这是一个引号,因为它们出现在应该有引号的字符串的开头和结尾。此页面也在“作为 HTML 实体的字符串:”部分中显示了这一点 software.hixie.ch/utilities/cgi/unicode-decoder/…
  • 我的错误......好吧,这让我有更多的工作可以等待

标签: python parsing unicode html-parsing ascii


【解决方案1】:

“ 形成一个UTF-8 字节序列,用于U+201C LEFT DOUBLE QUOTATION MARK 字符。那里主要是有什么东西被弄脏了。正确的编码应该是“

可以使用 HTML 解析器取消转义,但您需要修复生成的 Mochibake

>>> import HTMLParser
>>> h = HTMLParser.HTMLParser()
>>> x = '“'
>>> h.unescape(x)
u'\xe2\x80\x9c'
>>> h.unescape(x).encode('latin1')
'\xe2\x80\x9c'
>>> h.unescape(x).encode('latin1').decode('utf8')
u'\u201c'
>>> print h.unescape(x).encode('latin1').decode('utf8')
“

如果 printing 仍然给你一个 UnicodeEncodeError,那么你的终端或控制台配置不正确,Python 无意中编码为 ASCII。

【讨论】:

  • 谢谢,这就是我要找的。我正在解析一些正在浏览一些混乱页面的网络爬虫。最后一行在终端中工作,但不是在崇高的文本中,所以你是对的,我需要配置它
  • 是的,SublimeText 控制台没有传达它使用的编解码器,IIRC。
  • 啊比我从 unicode 字符串中提取它的方法要好得多 +1 不错
  • 这不是&#实体的有效使用。这些应该是 unicode 代码点,所以正确的表示应该是“。 (“ 在 HTML 中也可以,但您始终可以使用 &#x 表单,即使您不生成 HTML。)
  • @rici:是的,您甚至可以只包含文字字符并将文档正确编码为 UTF-8。我刚刚选择了“,因为它实际上是定义的。
【解决方案2】:

问题是您无法正确解码 unicode ...您需要将其从 unicode 转换为 utf8

x="“words words words"
h = HTMLParser.HTMLParser()
msg=h.unescape(x) #this converts it to unicode string ..
downcast = "".join(chr(ord(c)&0xff) for c in msg) #convert it to normal string (python2)
print downcast.decode("utf8")

在 HTMLParser 库中可能有更好的方法来做到这一点......

【讨论】:

  • 因为它是一个 UTF-8 编码的 U+201C 左双引号代码点。这是Mochibake。
猜你喜欢
  • 1970-01-01
  • 2016-09-04
  • 2020-02-06
  • 2014-12-28
  • 2012-10-28
  • 2020-02-12
  • 2018-04-19
  • 2013-01-18
相关资源
最近更新 更多