Dex*_*ter 7 python encode decode character-encoding
我有一个html页面列表,其中可能包含某些编码字符.一些例子如下 -
<a href="mailto:lad%20at%20maestro%20dot%20com">
<em>ada@graphics.maestro.com</em>
<em>mel@graphics.maestro.com</em>
Run Code Online (Sandbox Code Playgroud)
我想解码(逃避,我不确定当前的术语)这些字符串 -
<a href="mailto:lad at maestro dot com">
<em>ada@graphics.maestro.com</em>
<em>mel@graphics.maestro.com</em>
Run Code Online (Sandbox Code Playgroud)
请注意,HTML页面采用字符串格式.另外,我不想使用任何外部库,如BeautifulSoup或lxml,只有本机python库是可以的.
编辑 -
以下解决方案并不完美.HTML解析器unescaping与urllib2抛出一个
UnicodeDecodeError: 'ascii' codec can't decode byte 0x94 in position 31: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
在某些情况下出错.
您需要unescape HTML实体和URL-unquote.
标准库具有HTMLParser并urllib2帮助完成这些任务.
import HTMLParser, urllib2
markup = '''<a href="mailto:lad%20at%20maestro%20dot%20com">
<em>ada@graphics.maestro.com</em>
<em>mel@graphics.maestro.com</em>'''
result = HTMLParser.HTMLParser().unescape(urllib2.unquote(markup))
for line in result.split("\n"):
print(line)
Run Code Online (Sandbox Code Playgroud)
结果:
<a href="mailto:lad at maestro dot com">
<em>ada@graphics.maestro.com</em>
<em>mel@graphics.maestro.com</em>
Run Code Online (Sandbox Code Playgroud)
编辑:
如果您的页面可以包含非ASCII字符,则需要注意对输入进行解码并对输出进行编码.
您上传的示例文件已将charset设置为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)
Run Code Online (Sandbox Code Playgroud)
Edit2:
如果您不关心非ASCII字符,可以简化一下:
with open(filename) as fin:
decoded = fin.read().decode('ascii','ignore')
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2990 次 |
| 最近记录: |