我想爬(轻轻)一个网站,并下载每一个HTML页面,我爬行。为此,我使用库请求。我已经做了爬行清单,我尝试使用urllib.open爬行,但是没有用户代理,我会得到一个错误消息。所以我选择使用请求,但我不知道如何使用它。
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
}
page = requests.get('http://www.xf.com/ranking/get/?Amount=1&From=left&To=right', headers=headers)
with open('pages/test.html', 'w') as outfile:
outfile.write(page.text) 问题是,当脚本试图在我的文件中写入响应时,我会得到一些编码错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 6673-6675: ordinal not in range(128)我们如何在没有这些编码问题的情况下写入文件?
发布于 2015-09-26 09:27:53
在Python 2中,文本文件不接受Unicode字符串。使用response.content访问原始二进制、未解码的内容:
with open('pages/test.html', 'w') as outfile:
outfile.write(page.content) 这将写入下载的HTML的原始编码作为网站服务。
或者,如果您想重新编码特定编码的所有响应,请使用io.open()生成一个确实接受Unicode的文件对象:
import io
with io.open('pages/test.html', 'w', encoding='utf8') as outfile:
outfile.write(page.text) 请注意,许多网站依赖于在HTML标记中发送正确的编解码器,并且可以在不使用字符集参数的情况下提供内容。
在这种情况下,requests使用text/* mimetype (拉丁语-1)的默认编解码器将text/*解码为Unicode文本。,这往往是错误的编解码器,和依赖这种行为可能导致莫吉贝克输出以后。我建议您坚持编写二进制内容,并依赖像BeautifulSoup这样的工具来检测后面的正确编码。
或者,显式地测试是否存在charset参数,并且只有重新编码(通过response.text和io.open()或其他方式),如果requests没有回到拉丁语-1的默认值。请参阅https://stackoverflow.com/questions/1080411/retrieve-links-from-web-page-using-python-and-beautifulsoup/22583436#22583436获得一个答案,其中我使用这样的方法来告诉BeautifulSoup要使用什么编解码器。
发布于 2015-09-26 09:21:36
outfile.write(page.text.encode('utf8', 'replace'))我在这里找到了文档:unicode问题
https://stackoverflow.com/questions/32795060
复制相似问题