我错误地编码utf-8,我似乎无法解决它

时间:2018-03-25 17:58:23

标签: python unicode utf-8 python-requests

我已经构建了一个基本的scraper,它占用一个页面并将其写入txt文件。重要的代码是:

web_page = requests.get(url)

with open(filename) as file:
        file.write(str(web_page.content))

但是我生成的文本文件包含许多不正确的字符,例如\ xe2 \ x80 \ x9c

我已经做了很多阅读,并找到了三种可以避免这个问题的方法,但问题是我已经删除了大量我不想再做的数据了。

我尝试了三种方法来阻止问题的发生:

  • 指定编码,即str(site_2.content,“utf-8”)。这很奇怪,因为我的sys.getdefaultencoding()无论如何都是utf-8
  • 我本可以使用web_page.text而不是web_page.content
  • 我可以使用site_2.content.decode('utf-8')
  • 立即对其进行解码

但这些都不适用于我下载的文件。

1 个答案:

答案 0 :(得分:3)

这是[15, 7, 8, 3, 9, 4, 0, 11, 14, 6, 2, 10, 13, 5, 1, 12] [6, 14, 10, 3, 5, 13, 9, 1, 2, 4, 11, 7, 15, 12, 8, 0, None] [None, 2, 4, 5, 11, 13, 14, 15, 0, 1, 3, 7, 8, 9, 10, 12] 对象的python的字符串表示,而不是utf-8。 bytesweb_page.content将其解码为字符串之前的网页的二进制内容。 requests创建了一个python字符串表示的二进制数据(非ascii字节被转义,整个事件被包装在str(...)中),您写入该文件。您所要做的就是通过让python将字符串解析回二进制数据并保存它来反转该过程。

b'...'

将来您可以请求为您解码文件或保存二进制文件:

import ast
content = open('test.html').read()
open('test.html.fixed', 'wb').write(ast.literal_eval(content))