为了账号安全,请及时绑定邮箱和手机立即绑定

关于urllib.request.urlopen的编码问题

python3.5.2,环境是pycharm

去掉了spider_main中的try-except后发现报错如下:

Traceback (most recent call last):
  File "S:/Python Learning/baike_spider/spider_main.py", line 43, in <module>
    obj_spider.craw(root_url)  # 启动爬虫
  File "S:/Python Learning/baike_spider/spider_main.py", line 26, in craw
    html_cont = self.downloader.download(new_url)
  File "S:\Python Learning\baike_spider\html_downloader.py", line 10, in download
    resp = request.urlopen(url)
  File "E:\Tools\Python\Python3.5\lib\urllib\request.py", line 163, in urlopen
    return opener.open(url, data, timeout)
  File "E:\Tools\Python\Python3.5\lib\urllib\request.py", line 466, in open
    response = self._open(req, data)
  File "E:\Tools\Python\Python3.5\lib\urllib\request.py", line 484, in _open
    '_open', req)
  File "E:\Tools\Python\Python3.5\lib\urllib\request.py", line 444, in _call_chain
    result = func(*args)
  File "E:\Tools\Python\Python3.5\lib\urllib\request.py", line 1297, in https_open
    context=self._context, check_hostname=self._check_hostname)
  File "E:\Tools\Python\Python3.5\lib\urllib\request.py", line 1254, in do_open
    h.request(req.get_method(), req.selector, req.data, headers)
  File "E:\Tools\Python\Python3.5\lib\http\client.py", line 1107, in request
    self._send_request(method, url, body, headers)
  File "E:\Tools\Python\Python3.5\lib\http\client.py", line 1142, in _send_request
    self.putrequest(method, url, **skips)
  File "E:\Tools\Python\Python3.5\lib\http\client.py", line 984, in putrequest
    self._output(request.encode('ascii'))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 10-12: ordinal not in range(128)


html_downloader模块代码:

# coding:utf-8
from urllib import request
class HtmlDownloader(object):
    def download(self, url):
        if url is None:
            return None
        resp = request.urlopen(url)
        if resp.getcode() != 200:
            return None
        return resp.read()

查了很多但越改越乱,求解谢谢!

正在回答

2 回答

from urllib import request
class HtmlDownloader(object):
    def download(self, url):
        if url is None:
            return
        
        resp = request.urlopen(url)
        
        if resp.getcode() != 200:
            return
        
        return str(resp.read(), encoding = 'utf-8')

这样试试?

0 回复 有任何疑惑可以回复我~

原视频的讲解是以Python2为例。如果是初学,做实验时最好换成Python2,否则很多不兼容。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Python开发简单爬虫
  • 参与学习       227670    人
  • 解答问题       1219    个

本教程带您解开python爬虫这门神奇技术的面纱

进入课程

关于urllib.request.urlopen的编码问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信