开发者社区 问答 正文

无法下载https类型的资源

import pandas as pd
url_all = "https://sc.hkex.com.hk/TuniS/www.hkex.com.hk/chi/services/trading/securities/securitieslists/ListOfSecurities_c.xlsx"
stocks = pd.read_excel(url_all,skiprows=2,dtype=str)

很简单的代码,下载网页资源,读取成一个数据框。

总是有错误

File "<stdin>", line 1, in <module>
  File "/usr/local/lib64/python3.6/site-packages/pandas/util/_decorators.py", line 208, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_base.py", line 310, in read_excel
    io = ExcelFile(io, engine=engine)
  File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_base.py", line 819, in __init__
    self._reader = self._engines[engine](self._io)
  File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_xlrd.py", line 21, in __init__
    super().__init__(filepath_or_buffer)
  File "/usr/local/lib64/python3.6/site-packages/pandas/io/excel/_base.py", line 348, in __init__
    filepath_or_buffer = BytesIO(urlopen(filepath_or_buffer).read())
  File "/usr/lib64/python3.6/http/client.py", line 472, in read
    s = self._safe_read(self.length)
  File "/usr/lib64/python3.6/http/client.py", line 622, in _safe_read
    chunk = self.fp.read(min(amt, MAXAMOUNT))
  File "/usr/lib64/python3.6/socket.py", line 586, in readinto
    return self._sock.recv_into(b)
  File "/usr/lib64/python3.6/ssl.py", line 968, in recv_into
    return self.read(nbytes, buffer)
  File "/usr/lib64/python3.6/ssl.py", line 830, in read
    return self._sslobj.read(len, buffer)
  File "/usr/lib64/python3.6/ssl.py", line 587, in read
    v = self._sslobj.read(len, buffer)

请问,如何解决?

展开
收起
游客awtd46antogh6 2019-09-29 15:45:54 758 分享 版权
阿里云 AI 助理回答

这个错误信息表明在尝试使用pandas.read_excel()函数从URL直接读取Excel文件时遇到了问题,很可能是由于SSL连接或数据读取过程中出现了异常。考虑到你可能在一个受限的环境中执行此操作(如无界面服务器或特定Python环境),以下是一些建议来解决这个问题:

  1. 更新库: 确保你的pandas, openpyxl, xlrd等相关库是最新版本。有时候,库的更新会修复之前存在的问题。你可以通过运行以下命令来更新它们:

    pip install pandas --upgrade
    pip install openpyxl --upgrade  # 如果你处理的是.xlsx文件
    pip install xlrd --upgrade      # 对于.xls文件,但注意xlrd 2.0后不再支持.xlsx
    
  2. 手动下载并读取: 如果上述方法不奏效,可以尝试手动下载Excel文件到本地,然后通过本地路径读取文件。这样可以避免网络和SSL连接的问题。

    import pandas as pd
    
    # 假设你已经将文件下载到了'./ListOfSecurities_c.xlsx'
    local_file_path = "./ListOfSecurities_c.xlsx"
    stocks = pd.read_excel(local_file_path, skiprows=2, dtype=str)
    
  3. 使用requests库: 直接使用requests库来获取URL的内容,然后传递给pandas。这提供了更多的控制权来处理HTTP请求和响应。

    import pandas as pd
    import requests
    from io import BytesIO
    
    url_all = "https://sc.hkex.com.hk/TuniS/www.hkex.com.hk/chi/services/trading/securities/securitieslists/ListOfSecurities_c.xlsx"
    
    response = requests.get(url_all)
    response.raise_for_status()  # 检查请求是否成功
    stocks = pd.read_excel(BytesIO(response.content), skiprows=2, dtype=str)
    

    这段代码首先发送一个GET请求到指定的URL,然后确保请求成功(没有HTTP错误),最后使用返回的内容创建一个BytesIO对象,该对象被pandas.read_excel()方法接受。

  4. 检查网络配置: 如果是在企业内网或有特殊网络限制的环境下,可能需要检查防火墙设置或代理配置,确保能够顺利访问外部资源。

  5. SSL证书问题: 如果问题是由于SSL证书验证失败导致的,你可以在使用requests时禁用SSL验证,但这不是一个安全的做法,仅作为调试手段:

    response = requests.get(url_all, verify=False)
    

    请谨慎使用verify=False,因为它会使你的请求容易受到中间人攻击。

尝试上述建议中的一个或几个,希望能帮助你解决问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: