gpt4 book ai didi

python - 使用 Python 和 BeautifulSoup 从网页下载 .xls 文件

转载 作者:太空狗 更新时间:2023-10-30 01:00:31 25 4
gpt4 key购买 nike

我想从这个网站下载所有的.xls.xlsx.csv到指定的文件夹。

https://www.rbi.org.in/Scripts/bs_viewcontent.aspx?Id=2009

我研究了 mechanize、beautiful soup、urllib2 等。Mechanize 在 Python 3 中不起作用,urllib2 在 Python 3 中也有问题,我寻找解决方法但我找不到。因此,我目前正在尝试使用 Beautiful Soup 使其发挥作用。

我找到了一些示例代码并尝试修改它以适应我的问题,如下 -

from bs4 import BeautifulSoup
# Python 3.x
from urllib.request import urlopen, urlretrieve, quote
from urllib.parse import urljoin

url = 'https://www.rbi.org.in/Scripts/bs_viewcontent.aspx?Id=2009/'
u = urlopen(url)
try:
html = u.read().decode('utf-8')
finally:
u.close()

soup = BeautifulSoup(html)
for link in soup.select('div[webpartid] a'):
href = link.get('href')
if href.startswith('javascript:'):
continue
filename = href.rsplit('/', 1)[-1]
href = urljoin(url, quote(href))
try:
urlretrieve(href, filename)
except:
print('failed to download')

但是,运行此代码时不会从目标页面提取文件,也不会输出任何失败消息(例如“下载失败”)。

  • 如何使用 BeautifulSoup 从页面中选择 Excel 文件?
  • 如何使用 Python 将这些文件下载到本地文件?

最佳答案

您的脚本目前存在的问题是:

  1. url 有一个尾随 /,它在请求时提供无效页面,未列出您要下载的文件。
  2. soup.select(...) 中的 CSS 选择器正在选择具有 webpartid 属性的 div,该属性中的任何地方都不存在链接文档。
  3. 您正在加入 URL 并引用它,即使链接在页面中作为绝对 URL 给出并且不需要引用也是如此。
  4. try:...except: block 阻止您看到尝试下载文件时生成的错误。使用没有特定异常的 except block 是不好的做法,应该避免。

获取正确文件并尝试下载它们的代码的修改版本如下:

from bs4 import BeautifulSoup
# Python 3.x
from urllib.request import urlopen, urlretrieve, quote
from urllib.parse import urljoin

# Remove the trailing / you had, as that gives a 404 page
url = 'https://www.rbi.org.in/Scripts/bs_viewcontent.aspx?Id=2009'
u = urlopen(url)
try:
html = u.read().decode('utf-8')
finally:
u.close()

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("Downloading %s to %s..." % (href, filename) )
urlretrieve(href, filename)
print("Done.")

但是,如果您运行它,您会注意到 urllib.error.HTTPError: HTTP Error 403: Forbidden 异常被抛出,即使该文件可以在浏览器中下载。起初我以为这是一个推荐检查(以防止热链接),但是如果您在浏览器(例如 Chrome 开发者工具)中查看请求,您会注意到最初的 http:// 请求也在那里被阻止,然后 Chrome 尝试对同一文件发出 https:// 请求。

换句话说,请求必须通过 HTTPS 才能工作(不管页面中的 URL 是什么)。要解决此问题,您需要在使用请求的 URL 之前将 http: 重写为 https:。以下代码将正确修改 URL 并下载文件。我还添加了一个变量来指定输出文件夹,使用 os.path.join 将其添加到文件名中:

import os
from bs4 import BeautifulSoup
# Python 3.x
from urllib.request import urlopen, urlretrieve

URL = 'https://www.rbi.org.in/Scripts/bs_viewcontent.aspx?Id=2009'
OUTPUT_DIR = '' # path to output folder, '.' or '' uses current folder

u = urlopen(URL)
try:
html = u.read().decode('utf-8')
finally:
u.close()

soup = BeautifulSoup(html, "html.parser")
for link in soup.select('a[href^="http://"]'):
href = link.get('href')
if not any(href.endswith(x) for x in ['.csv','.xls','.xlsx']):
continue

filename = os.path.join(OUTPUT_DIR, href.rsplit('/', 1)[-1])

# We need a https:// URL for this site
href = href.replace('http://','https://')

print("Downloading %s to %s..." % (href, filename) )
urlretrieve(href, filename)
print("Done.")

关于python - 使用 Python 和 BeautifulSoup 从网页下载 .xls 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34632838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com