我被困在这里试图浏览HTML特殊字符。
有问题的文字是
Rudimental & Emeli Sandé
应转换为 Rudimental& EmeliSandé
通过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。
答案 0 :(得分:5)
Python无法使用ASCII编解码器解码'é'(' \ xe9 '),因为此字符不是7位ASCII。
你的问题(浓缩):
import HTMLParser
parser = HTMLParser.HTMLParser()
input = 'Rudimental & 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 & 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)