繁体   English   中英

编码字符串python的解码

[英]Encode Decode of strings python

我有一个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解析器unescaping与urllib2抛出一个

UnicodeDecodeError: 'ascii' codec can't decode byte 0x94 in position 31: ordinal not in range(128)

在某些情况下出错。

您需要unescape HTML实体和URL-unquote。
标准库具有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)

EDIT2:
如果您不关心非ASCII字符,可以简化一下:

with open(filename) as fin:
    decoded = fin.read().decode('ascii','ignore')
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM