在Python 2.7.3 / Raspberry Pi中使用特殊字符转义HTML

576*_*76i 5 character-encoding html-parsing python-2.7 raspberry-pi python-unicode

我被困在这里尝试不转义HTML特殊字符。

有问题的文字是

Rudimental & Emeli Sandé
Run Code Online (Sandbox Code Playgroud)

应该转换为 基本&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)
Run Code Online (Sandbox Code Playgroud)

当一行中有é时,我会收到此错误。

*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)*
Run Code Online (Sandbox Code Playgroud)

相同的代码在Windows下可以正常工作-我只在运行Python 2.7.3的树莓派上遇到问题。

Yur*_*rim 7

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

您的问题(浓缩):

import HTMLParser
parser = HTMLParser.HTMLParser()
input = 'Rudimental &amp; Emeli Sand\xe9'
output = parser.unescape(input)
Run Code Online (Sandbox Code Playgroud)

产生

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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

或者在使用文件时使用codecs.open()而不是open()

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