从给定 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 等
注意它以 .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
我在 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 等
注意它以 .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