【问题标题】:urllib.urlretrieve encoding is not kept不保留 urllib.urlretrieve 编码
【发布时间】:2014-06-28 08:39:39
【问题描述】:

我正在使用 python 3.4。

当我在 utf-8 文件上使用 urllib.request.urlretrieve(link, filename="file.html") 时,生成的 file.html 未正确编码。如何确保文件是使用 utf-8 编码的? 这种情况下如何实现.decode(utf-8)?

编辑

这是页面的原始部分:

« Écoute, mon peuple, je parle ;
Moi,Dieu,je suis ton Dieu !
Je ne t'accus pas pour tes 牺牲 ;
tes holocaustes sont toujours devant moi。

« Je ne prendrai pas un seul taureau de ton domaine,
pas un bélier de tes enclos。
Tout le gibier des forêts m'appartient
et le bétail des hauts pâturages。

« Si j'ai faim, irai-je te le dire ?
Le monde et sa richesse m'appartiennent。
Vais-je manger la chair des taureaux
et boire le sang des béliers ?

« Qu'as-tu à réciter mes lois,
à garder mon Alliance à la bouche,
toi qui n'aimes pas les reproches
et rejettes loin de toi mes paroles ? »

这就是我在保存的文件中得到的:

�“cute,mon peuple,je parle ;�
Moi,Dieu,je suis ton Dieu!�
Je ne t'accuse pas pour tes 牺牲;
tes holocaustes sont toujours devant moi。

� Je ne prendrai pas un seul taureau de ton domaine,
pas un b�lier de tes enclos。�
Tout le gibier des for �ts m'appartient
et le b�tail des hauts p�turages。

� Si j'ai faim, irai-je te le dire ?
Le monde et sa richesse m'appartiennent。�
Vais-je manger la chair des taureaux
et boire le sang des b�liers ?�

� Qu'as-tu � r�citer mes lois,�
�garder mon Alliance � la bouche,�
toi qui n'aimes pas les reproches
et rejettes loin de toi mes paroles ?��

我注意到在页面的某些部分,重音字符并不是真正的 utf-8 编码,但浏览器可以正确显示。例如,É 不是 É,当下载文件时,这似乎会导致问题。

【问题讨论】:

标签: python python-3.x urllib


【解决方案1】:

您可以使用here所示的方法逐行取消文件中的HTML转义序列。

import html.parser
h = html.parser.HTMLParser()
with urllib.request.urlopen(link) as fin, open(
           "file.html", 'w', encoding='utf-8') as fout:
    for line in fin:
        fout.write(h.unescape(line.decode('utf-8')))

【讨论】:

  • 我尝试了这段代码,它做了一些事情,但不完全是我需要的。实际上,文本未转义,但生成的文件以 windows-1252 编码保存,即使原始文件中未转义的行也是如此。
  • @ToDo 尝试在对open 的调用中指定encoding,如编辑后的答案所示。
  • 成功了。我必须弄清楚如何为我在此脚本中下载的每个链接创建一个函数以使用此代码。
【解决方案2】:

我建议使用它为您处理这个问题:它将加载的文档隐式转换为 utf-8

markup = "<h1>Sacr\xc3\xa9 bleu!</h1>"
soup = BeautifulSoup(markup)
soup.h1
# <h1>Sacré bleu!</h1>
soup.h1.string
# u'Sacr\xe9 bleu!'

BeautifulSoup 文档:here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多