在Python 2.7.3 / 树莓派中如何解码带有特殊字符的HTML?

6

我是一名有用的助手,可以为您翻译文本。

我被困在尝试取消转义HTML特殊字符的过程中。

问题出在这段文字上:

Rudimental & Emeli Sandé

应将其转换为Rudimental&Emeli Sandé

该文本是通过WGET(非python内部)下载的

要测试这个,请保存一个带有此行的ANSI文件并导入它。

import HTMLParser

trackentry = open('import.txt', 'r').readlines()
print(trackentry)
track = trackentry[0]
html_parser = HTMLParser.HTMLParser()

track = html_parser.unescape(track)

print(track)

当一行中有é时,我会遇到这个错误。

*pi@raspberrypi ~/scripting $ python unparse.py
['Rudimental & Emeli Sand\xe9\n']
Traceback (most recent call last):
  File "unparse.py", line 9, in <module>
    track = html_parser.unescape(track)
  File "/usr/lib/python2.7/HTMLParser.py", line 472, in unescape
    return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s)
  File "/usr/lib/python2.7/re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 11: ordinal not in range(128)*

同样的代码在Windows下运行良好,但在运行Python 2.7.3的树莓派上出现了问题。

1个回答

10

Python无法使用ASCII编解码器解码“é”(“\xe9”),因为该字符不是7位ASCII。

您遇到的问题(简化版本):

import HTMLParser
parser = HTMLParser.HTMLParser()
input = 'Rudimental &amp; Emeli Sand\xe9'
output = parser.unescape(input)

产生
Traceback (most recent call last):
  File "problem.py", line 4, in <module>
    output = parser.unescape(input)
  File "/usr/lib/python2.7/HTMLParser.py", line 475, in unescape
    return re.sub(r"&(#?[xX]?(?:[0-9a-fA-F]+|\w{1,8}));", replaceEntities, s)
  File "/usr/lib/python2.7/re.py", line 151, in sub
    return _compile(pattern, flags).sub(repl, string, count)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 11: ordinal not in range(128)

HTMLParser.unescape() 返回一个 unicode 对象,因此必须将输入的 str 进行转换。它会请求默认编码(在您的情况下为 ASCII),并且无法将 '\xe9' 解释为 ASCII 字符(因为它不是)。我猜您的文件编码是 ISO-8859-1,其中 '\xe9' 是 'é'。

有两种简单的解决方案。要么手动进行转换:

import HTMLParser
parser = HTMLParser.HTMLParser()
input = 'Rudimental &amp; Emeli Sand\xe9'
input = input.decode('iso-8859-1')
output = parser.unescape(input)

在处理文件时,建议使用 codecs.open() 而不是 open()

import codecs
import HTMLParser
parser = HTMLParser.HTMLParser()
input = codecs.open("import.txt", encoding="iso-8859-1").readline()
output = parser.unescape(input)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接