从给定 URL 下载文件并使用 Google Colab 保存文件时出现问题

Issue with downloading a file from a given URL and saving it using Google Colab

我在 GitHub 中有一些 java 个文件的 URL 个。我想将 URL 传递给方法,下载文件并使用不同的唯一名称保存它。

这是我写的代码,它有代码片段下面提到的问题。

!pip install wget

import wget
from datetime import datetime


def download_file(url):

   # Creating file name
   now_time =datetime.now()
   millisec = now_time.timestamp() * 10000
   millisec = str(millisec).split('.')[0]
   partial_name = url.split('/')[-1].split('.')[0]
   file_name = partial_name + millisec + '.java'

   # Download the file and save in colab location
   wget.download(url, file_name)

   return file_name

我传给这个方法的样本URL是'https://github.com/e32wong/CloCom/blob/master/CloneDigger.java'

问题是,下载的 java 文件的内容显示为充满标签的 HTML 内容。 但是,[=30 上的原始文件=] 是一个简单的 java 文件。

我想按原样保存文件。请解决此问题。

因为你说文件正在存储 HTML 输出,问题可能是你给出文件的 HTML link 而不是原始文件 link.因此,wget 下载网页并将其存储。 相反,您应该提供原始 link,您可以在文件的 header 部分找到它,如下所示 -

你怎么知道它是原始文件还是 URL?

您只看到 URL 的最后一部分,如果它是文件的 link,它将以文件扩展名结尾,例如 - .jgp、.cpp、.py 等

图像的原始 link 示例 - https://helpx.adobe.com/content/dam/help/en/photoshop/using/convert-color-image-black-white/jcr_content/main-pars/before_and_after/image-before/Landscape-Color.jpg

注意它以 .jpg 结尾

您无法通过 github.com URL 以编程方式访问 Java 文件的实际内容。它旨在通过浏览器(Github 站点)向最终用户显示内容。要获取存储在 Github 存储库中的文件的原始内容,必须使用“raw.githubusercontent.com”URL。

以下是您的 download_file 函数的重构。它将您想要的文件下载到特定的 google 驱动器文件夹。

import os
from google.colab import drive
 
drive.mount('/content/drive')

# notice the difference in the URL.
url = "https://raw.githubusercontent.com/e32wong/CloCom/master/CloneDigger.java"

def download_file(url):
  destination_path = "/content/drive/My Drive/code_files"
  os.chdir(destination_path)
  !wget "$url"

download_file(url)

您正在尝试下载 Github 页面而不是源文件。因此它将作为 HTML 页面下载。您必须使用原始 URL 从 Github 下载任何源文件。所以,如果你想写一个自动脚本来下载源文件,那么你可以先从给定的 GitHub 页面抓取原始的 URL 然后原始的 URL 可以作为你的方法的参数。

因此,您可以按如下方式更改脚本

import wget
from datetime import datetime
from bs4 import BeautifulSoup
import requests

HEADER = {
    "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
}

def find_raw_url(url):

    response = requests.get(url, headers=HEADER)
    soup = BeautifulSoup(response.text, "html.parser")
    if soup is not None:
        rawUrl = soup.find(id='raw-url')
        if rawUrl is not None: 
            rawUrl = rawUrl['href']
            if rawUrl is not None:
                return 'https://github.com' + rawUrl
            
    return None


def download_file(url):
    
   raw_url = find_raw_url(url)
   
   if raw_url is not None:
       # Creating file name
       now_time =datetime.now()
       millisec = now_time.timestamp() * 10000
       millisec = str(millisec).split('.')[0]
       partial_name = url.split('/')[-1].split('.')[0]
       file_name = partial_name + millisec + '.java'
    
       # Download the file and save in colab location
       wget.download(raw_url, file_name)
   else:
       print('Cannot find raw url to download from github')


download_file('https://github.com/e32wong/CloCom/blob/master/CloneDigger.java')

谢谢。

问题出在 URL。您必须传递文件的原始 URL。

Page URL:'https://github.com/e32wong/CloCom/blob/master/CloneDigger.java'

Raw URL: 'https://raw.githubusercontent.com/e32wong/CloCom/master/CloneDigger.java'

您可以通过替换来轻松修改 url。试试这个。

def download_file(url):

   # Creating file name
   now_time =datetime.now()
   millisec = now_time.timestamp() * 10000
   millisec = str(millisec).split('.')[0]
   partial_name = url.split('/')[-1].split('.')[0]
   file_name = partial_name + millisec + '.java'

   #Edit url as the raw file url of github
   url = url.replace('github.com', 'raw.githubusercontent.com', 1)
   url = url.replace('/blob/', '/',1)

   # Download the file and save in colab location
   
   wget.download(url, file_name)

   return file_name