首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python爬虫:下载HTML页面

Python爬虫:下载HTML页面
EN

Stack Overflow用户
提问于 2015-09-26 08:15:36
回答 2查看 629关注 0票数 0

我想爬(轻轻)一个网站,并下载每一个HTML页面,我爬行。为此,我使用库请求。我已经做了爬行清单,我尝试使用urllib.open爬行,但是没有用户代理,我会得到一个错误消息。所以我选择使用请求,但我不知道如何使用它。

代码语言:javascript
复制
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) 

问题是,当脚本试图在我的文件中写入响应时,我会得到一些编码错误:

代码语言:javascript
复制
UnicodeEncodeError: 'ascii' codec can't encode characters in position 6673-6675: ordinal not in range(128)

我们如何在没有这些编码问题的情况下写入文件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-26 09:27:53

在Python 2中,文本文件不接受Unicode字符串。使用response.content访问原始二进制、未解码的内容:

代码语言:javascript
复制
with open('pages/test.html', 'w') as outfile:
    outfile.write(page.content) 

这将写入下载的HTML的原始编码作为网站服务。

或者,如果您想重新编码特定编码的所有响应,请使用io.open()生成一个确实接受Unicode的文件对象:

代码语言:javascript
复制
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.textio.open()或其他方式),如果requests没有回到拉丁语-1的默认值。请参阅https://stackoverflow.com/questions/1080411/retrieve-links-from-web-page-using-python-and-beautifulsoup/22583436#22583436获得一个答案,其中我使用这样的方法来告诉BeautifulSoup要使用什么编解码器。

票数 2
EN

Stack Overflow用户

发布于 2015-09-26 09:21:36

代码语言:javascript
复制
outfile.write(page.text.encode('utf8', 'replace'))

我在这里找到了文档:unicode问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32795060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档