python - 字符串python的编码解码

标签 python character-encoding decode encode

我有一个 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,只有 native python 库是可以的。

编辑 -

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

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

在某些情况下会出错。

最佳答案

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

编辑2:
如果您不关心非 ASCII 字符,您可以稍微简化一下:

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

关于python - 字符串python的编码解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856990/

相关文章:

python - 从 Python 到 Mathematica 再返回

python - 查找和替换特定列中的破折号

Python - 具有多个(目标列表 "=")组的赋值语句有优点/缺点吗?

windows - 什么是 Windows 代码页?

mysql - mysql中的排序规则有什么用

character-encoding - 一个字符有多少位或字节?

swift - 使用协议(protocol)类型属性对结构进行解码/编码

ios - 如何解码json数据的url?

python - 如何在串行通信中使用 pyserial 解码字节

Python 未实现的方法与抽象方法,哪个更 Pythonic? PyCharm 不喜欢未在基类中实现的方法