无法下载文件,Python xlsx文件下载零字节

时间:2017-09-11 09:26:37

标签: python urllib2 xlsx

运行代码后,下载的文件为0bytes。我也尝试过编写回复,也尝试使用缓冲区

我做错了什么,我还能尝试什么?请帮忙

import urllib2
from bs4 import BeautifulSoup
import os
import pandas as pd    
storePath='/home/vinaysawant/BankIFSCCodes/'
def DownloadFiles():
    # Remove the trailing / you had, as that gives a 404 page
    url='https://rbi.org.in/scripts/Bs_viewcontent.aspx?Id=2009'

    conn = urllib2.urlopen(url)
    html = conn.read().decode('utf-8')
    soup = BeautifulSoup(html, "html.parser")

    # Select all A elements with href attributes containing URLs starting with http://
    for link in soup.select('a[href^="http://"]'):
        href = link.get('href')

        # Make sure it has one of the correct extensions
        if not any(href.endswith(x) for x in ['.csv','.xls','.xlsx']):
            continue
        filename = href.rsplit('/', 1)[-1]
        print href
        print("Downloading %s to %s..." % (href, filename) )
        #urlretrieve(href, filename)
        u = urllib2.urlopen(href)
        f = open(storePath+filename, 'wb')
        meta = u.info()
        file_size = int(meta.getheaders("Content-Length")[0])
        print "Downloading: %s Bytes: %s" % (filename, file_size)
        print("Done.")
        file_size_dl = 0
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break

            file_size_dl += len(buffer)
            f.write(buffer)
            status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
            status = status + chr(8) * (len(status) + 1)
            print status,
        f.close()

        exit(1)


DownloadFiles()

我也试过

import urllib
urllib.retreive(url)
  

我也尝试过使用urllib2 urllib3。

2 个答案:

答案 0 :(得分:0)

我对pandas和urllib2并不擅长,但因为这个问题没有答案。我认为问题是你试图下载第一个网址

url='https://rbi.org.in/scripts/Bs_viewcontent.aspx?Id=2009

你在这里定义它然后不改变它

u = urllib2.urlopen(url)

之后,您尝试下载与网址相关联的内容

buffer = u.read(block_sz)

而不是他们我猜你应该尝试下载href 所以试着改变这个

u = urllib2.urlopen(url)

 u = urllib2.urlopen(href)

答案 1 :(得分:0)

问题是重定向到HTTPS是通过js而不是HTTP标头完成的,因此urllib不会跟随。但是,您可以在链接上使用replace并手动更改协议。

href = link.get('href').replace('http://', 'https://')

虽然这解决了问题,但在try-except块中使用urlopen并不是一个坏主意。

try: 
    u = urllib2.urlopen(href)
except Exception as e:
    print(e)
    continue