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

标签 python-2.7 character-encoding html-parsing raspberry-pi python-unicode

我被困在这里试图对 HTML 特殊字符进行转义。

有问题的文字是

Rudimental & Emeli Sandé

应该转换为
基本和 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 下运行良好 - 我只在 raspberry pi 上有问题
运行 Python 2.7.3。

最佳答案

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)

或者您使用 编解码器.open() 而不是 打开()每当您处理文件时:
import codecs
import HTMLParser
parser = HTMLParser.HTMLParser()
input = codecs.open("import.txt", encoding="iso-8859-1").readline()
output = parser.unescape(input)

关于python-2.7 - 在 Python 2.7.3/Raspberry Pi 中使用特殊字符转义 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21342549/

相关文章:

php - zend_mm_heap 错误与 simple_html_dom

python - Python mimetypes.init() 是一个过时的函数吗?

python-2.7 - Paramiko start_server 不工作

javascript - URL 中的重音符号,如何正确转义它们?

utf-8 - dumbster 单元测试邮件服务器不返回预期的邮件正文?

通过 CSS 选择器进行 Python HTML 解析

java - 如何使用 jsoup 将一个元素替换为元素列表?

Python - 如何在新创建的目录中创建多个文件夹?

python - 在列表列表中查找值时遇到问题

c - 如何使用移位序列输出另一个字符集中的字符