2017-02-19 5 views
0

tfp = open(filename, 'wb')OSError: [Errno 22} Недопустимый аргумент: 'загружен/misc/jquery.js? V = 1.4.4'

OSError: [Errno 22} Invalid argument: 'downloaded/misc/jquery.js?v=1.4.4'

Может ли кто-нибудь помочь мне с этой ошибкой? Я полагаю, что это имеет какое-то отношение к jquery.js?v=1.4.4 недействительным. Я новичок в python; Прошу прощения, если я упустил что-то очевидное.

Вот код:

import os 
from urllib.request import urlretrieve 
from urllib.request import urlopen 
from bs4 import BeautifulSoup 

downloadDirectory = "downloaded" 
baseUrl = "http://pythonscraping.com" 

def getAbsoluteURL(baseUrl, source): 
    if source.startswith("http://www."): 
     url = "http://"+source[11:] 
    elif source.startswith("http://"): 
     url = source 
    elif source.startswith("www."): 
     url = source[4:] 
     url = "http://"+source 
    else: 
     url = baseUrl+"/"+source 
    if baseUrl not in url: 
     return None 
    return url 

def getDownloadPath(baseUrl, absoluteUrl, downloadDirectory): 
    path = absoluteUrl.replace("www.", "") 
    path = path.replace(baseUrl, "") 
    path = downloadDirectory+path 
    directory = os.path.dirname(path) 

    if not os.path.exists(directory): 
     os.makedirs(directory) 

    return path 

html = urlopen("http://www.pythonscraping.com") 
bsObj = BeautifulSoup(html, "html.parser") 
downloadList = bsObj.findAll(src=True) 

for download in downloadList: 
    fileUrl = getAbsoluteURL(baseUrl, download["src"]) 
    if fileUrl is not None: 
     print(fileUrl) 
     urlretrieve(fileUrl, getDownloadPath(baseUrl, fileUrl, downloadDirectory)) 
+0

Это не правильный файл для загрузки, может быть, это не правильная ссылка для загрузки файла. – Arman

+0

Да, это имеет смысл. Спасибо. –

ответ

1

Для функции urlretrieve(url, filename, reporthook, data), аргумент вы даете для параметра filename должен быть допустимым именем файла в вашей операционной системе.

В этом случае при запуске

urlretrieve(fileUrl, getDownloadPath(baseUrl, fileUrl, downloadDirectory)) 

аргумента вы даете для url является «http://pythonscraping.com/misc/jquery.js?v=1.4.4», а аргумент вы даете для filename является «скачан/разным/jquery.js? V = 1,4. 4" .

"jquery.js? V = 1.4.4" Я считаю, что это неверное имя файла.

Решение: в функции getDownloadPath, изменить return path к

return path.partition('?')[0] 
0

скачивании/разное/jquery.js v = 1.4.4 не является допустимым именем файла?. Я думаю, что лучшее решение, как это:

import requests 
from bs4 import BeautifulSoup 

download_directory = "downloaded" 
base_url = "http://www.pythonscraping.com/" 
# Use Requests instead urllib 
def get_files_url(base_url): 
    # Return a list of tag elements that contain src attrs 
    html = requests.get(base_url) 
    soup = BeautifulSoup(html.text, "lxml") 
    return soup.find_all(src=True) 

def get_file_name(url): 
    # Return the last part after the last "/" as file name 
    # Eg: return a.png as file name if url=http://pythonscraping.com/a.png 
    # Remove characters not valid in file name 
    file_name = url.split("/")[-1] 
    remove_list = "?><\/:\"*|" 
    for ch in remove_list: 
     if ch in file_name: 
      file_name = file_name.replace(ch, "") 
    return download_directory + "/" + file_name 

def get_formatted_url(url): 
    if not url.startswith("http://"): 
     return base_url + url 
    elif base_url not in url: 
     return None 
    else: 
     return url 

links = get_files_url(base_url) 

for link in links: 
    url = link["src"] 
    url = get_formatted_url(url) 
    if url is None: 
     continue 
    print(url) 
    result = requests.get(url, stream=True) 
    file_name = get_file_name(url) 
    print(file_name) 
    with open(file_name, 'wb') as f: 
     for chunk in result.iter_content(10): 
      f.write(chunk)