【问题标题】:Encode Decode of strings python字符串python的编码解码
【发布时间】:2012-03-25 00:43:30
【问题描述】:

我有一个可能包含某些编码字符的 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 库可以。

编辑 -

以下解决方案并不完美。使用 urllib2 进行转义的 HTML 解析器会抛出一个

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

在某些情况下会出错。

【问题讨论】:

    标签: python character-encoding decode encode


    【解决方案1】:

    您需要取消转义 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')
    ...
    

    【讨论】:

    • 虽然这个解决方案看起来不错,但在某些地方会抛出 UnicodeDecodeError: 'ascii' codec can't decode byte 0x94 in position 31: ordinal not in range(128) 错误。
    • 在输入之前尝试在标记字符串上使用 .encode('ascii')。
    • @mcenley:如果您发布有关如何获取数据的更多详细信息,我们可以提供编码帮助。
    • @bernie 我有一个下载的 html 页面列表。我应该如何将它们发送给您?
    • 不不,我相信你。我们需要的是用于这些页面的编码,以及您阅读它们的方式。原理是在输入上解码(到Unicode),在输出上编码。
    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2012-11-13
    • 2012-03-25
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多