用beauthoulsoup在一个网站上下载所有的文档抛出IOE

2024-05-15 15:09:48 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我想通过Python、Julia或任何语言脚本下载以下网站(https://www.nationalgrid.com/uk/electricity/market-and-operational-data/data-explorer)上发布的所有文件。它曾经是一个http的网站,BeautifulSoup运行良好;现在我的代码上的https网站已经不工作了。在

我想要下载的所有文件都在一个'a'标记中,并且属于“download”类。因此,代码中不起作用的行如下:

fileDownloader.retrieve(document_url, "forecasted-demand-files/"+document_name)

这将引发以下错误:

^{pr2}$

在网上做了一些研究之后,我没有找到任何关于如何在https网站上删除文档的信息,有人能给我个建议吗?在

提前感谢您的回答!在

朱利安

import requests
import urllib
import re

from bs4 import BeautifulSoup

page = requests.get("https://www.nationalgrid.com/uk/electricity/market-and-
operational-data/data-explorer")
soup = BeautifulSoup(page.content, 'html.parser')

fileDownloader = urllib.URLopener()
mainLocation = "https://www.nationalgrid.com"

for document in soup.find_all('a', class_='download'):
  document_name = document["title"]
  document_url = mainLocation+document["href"]
  fileDownloader.retrieve(document_url, "files/"+document_name)

Tags: namehttpsimportcomurldata网站www
2条回答

这不是一个https问题,只是你试图抓取的页面有一些文件访问限制。当您期望异常时,最好处理它们。在这种情况下,所有的文件链接都可能断开或无法访问。在

尝试按如下方式处理异常:

import requests
import urllib
import re

from bs4 import BeautifulSoup

page = requests.get("https://www.nationalgrid.com/uk/electricity/market-and-operational-data/data-explorer")
soup = BeautifulSoup(page.content, 'html.parser')

fileDownloader = urllib.URLopener()
mainLocation = "https://www.nationalgrid.com"

for document in soup.find_all('a', class_='download'):

    document_name = document["title"]
    document_url = mainLocation+document["href"]
    try:
        fileDownloader.retrieve(document_url, "forecasted-demand-files/"+document_name)
    except IOError as e:
        print('failed to download: {}'.format(document_url))

这个问题的问题是,为了满足请求,您应该将代理作为头传递。在

我不知道如何使用urllib来实现这一点,但是由于您已经在使用requests(它更人性化),您可以使用以下代码来实现这一点:

import requests
import urllib

from bs4 import BeautifulSoup

page = requests.get("https://www.nationalgrid.com/uk/electricity/market-and-operational-data/data-explorer")
soup = BeautifulSoup(page.content, 'html.parser')


mainLocation = "http://www2.nationalgrid.com"
header = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
    'Accept-Language': 'en-US,en;q=0.8',
    'Connection': 'keep-alive'
}

for a_link in soup.find_all('a', class_='download'):
    document_name = a_link["title"]
    document_url = mainLocation + a_link["href"]
    print('Getting file: {}'.format(document_url))
    page = requests.get(document_url, headers=header)
    file_to_store = a_link.get('href').split('/')[-1]
    with open('files/' + file_to_store, 'w') as f_out:
        f_out.write(page.content)

只需要一个小黑客从链接中检索文件名。在

相关问题 更多 >