Python中的字符串编码解码

8

我有一个HTML页面列表,其中可能包含某些编码字符。以下是一些示例 -

<a href="mailto:lad%20at%20maestro%20dot%20com">
<em>ada&#x40;graphics.maestro.com</em>
<em>mel&#x40;graphics.maestro.com</em>

我希望将这些字符串进行解码(也就是说,转义,当前术语不确定),结果为 -

 <a href="mailto:lad at maestro dot com">
<em>ada@graphics.maestro.com</em>
<em>mel@graphics.maestro.com</em>

注意,HTML页面以字符串格式存在。另外,我不想使用任何外部库,如BeautifulSoup或lxml,只能使用本机python库。
编辑-
下面的解决方案并不完美。HTML Parser在使用urllib2进行转义时会抛出异常。
UnicodeDecodeError: 'ascii' codec can't decode byte 0x94 in position 31: ordinal not in range(128)

在某些情况下会出现错误。
1个回答

8

您需要取消转义HTML实体和URL解码。
标准库有HTMLParserurllib2来帮助完成这些任务。

import HTMLParser, urllib2

markup = '''<a href="mailto:lad%20at%20maestro%20dot%20com">
<em>ada&#x40;graphics.maestro.com</em>
<em>mel&#x40;graphics.maestro.com</em>'''

result = HTMLParser.HTMLParser().unescape(urllib2.unquote(markup))
for line in result.split("\n"): 
    print(line)

结果:

<a href="mailto:lad at maestro dot com">
<em>ada@graphics.maestro.com</em>
<em>mel@graphics.maestro.com</em>

编辑:
如果您的页面可能包含非ASCII字符,则需要注意在输入时解码并在输出时进行编码。
您上传的示例文件的字符集设置为cp-1252,因此让我们尝试从该字符集解码为Unicode:

import codecs 
with codecs.open(filename, encoding="cp1252") as fin:
    decoded = fin.read()
result = HTMLParser.HTMLParser().unescape(urllib2.unquote(decoded))
with codecs.open('/output/file.html', 'w', encoding='cp1252') as fou:
    fou.write(result)

编辑2:
如果您不关心非ASCII字符,可以简化一些:
with open(filename) as fin:
    decoded = fin.read().decode('ascii','ignore')
...

尝试在输入之前对标记字符串使用 .encode('ascii')。 - Niall Byrne
如果你能提供关于如何获取数据的更多细节,我们可以提供编码方面的帮助。- @mcenley - mechanical_meat
@bernie,我有一些下载好的HTML页面列表。我应该如何将它们发送给您? - Dexter
@mcenley:太好了,谢谢。我会更新我的答案。请稍等片刻。 - mechanical_meat
@mcenley:有各种尝试这样做的方法;然而,由于编码之间的微妙差异,猜测通常不被推荐。 - mechanical_meat
显示剩余10条评论

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