web-dev-qa-db-fra.com

Aucun schéma fourni et autres erreurs lors de l'utilisation de request.get ()

J'apprends Python en suivant Automate the Boring Stuff. Ce programme est censé aller sur http://xkcd.com/ et télécharger toutes les images pour être hors ligne visualisation.

Je suis sur la version 2.7 et Mac.

Pour une raison quelconque, j'obtiens des erreurs comme "Aucun schéma fourni" et des erreurs lors de l'utilisation de request.get () lui-même.

Voici mon code:

# Saves the XKCD comic page for offline read

import requests, os, bs4, shutil

url = 'http://xkcd.com/'

if os.path.isdir('xkcd') == True: # If xkcd folder already exists
    shutil.rmtree('xkcd') # delete it
else: # otherwise
    os.makedirs('xkcd') # Creates xkcd foulder.


while not url.endswith('#'): # If there are no more posts, it url will endswith #, exist while loop
    # Download the page
    print 'Downloading %s page...' % url
    res = requests.get(url) # Get the page
    res.raise_for_status() # Check for errors

    soup = bs4.BeautifulSoup(res.text) # Dowload the page
    # Find the URL of the comic image
    comicElem = soup.select('#comic img') # Any #comic img it finds will be saved as a list in comicElem
    if comicElem == []: # if the list is empty
        print 'Couldn\'t find the image!'
    else:
        comicUrl = comicElem[0].get('src') # Get the first index in comicElem (the image) and save to
        # comicUrl

        # Download the image
        print 'Downloading the %s image...' % (comicUrl)
        res = requests.get(comicUrl) # Get the image. Getting something will always use requests.get()
        res.raise_for_status() # Check for errors

        # Save image to ./xkcd
        imageFile = open(os.path.join('xkcd', os.path.basename(comicUrl)), 'wb')
        for chunk in res.iter_content(10000):
            imageFile.write(chunk)
        imageFile.close()
    # Get the Prev btn's URL
    prevLink = soup.select('a[rel="prev"]')[0]
    # The Previous button is first <a rel="prev" href="/1535/" accesskey="p">&lt; Prev</a>
    url = 'http://xkcd.com/' + prevLink.get('href')
    # adds /1535/ to http://xkcd.com/

print 'Done!'

Voici les erreurs:

Traceback (most recent call last):
  File "/Users/XKCD.py", line 30, in <module>
    res = requests.get(comicUrl) # Get the image. Getting something will always use requests.get()
  File "/Library/Python/2.7/site-packages/requests/api.py", line 69, in get
    return request('get', url, params=params, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 451, in request
    prep = self.prepare_request(req)
  File "/Library/Python/2.7/site-packages/requests/sessions.py", line 382, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/Library/Python/2.7/site-packages/requests/models.py", line 304, in prepare
    self.prepare_url(url, params)
  File "/Library/Python/2.7/site-packages/requests/models.py", line 362, in prepare_url
    to_native_string(url, 'utf8')))
requests.exceptions.MissingSchema: Invalid URL '//imgs.xkcd.com/comics/the_martian.png': No schema supplied. Perhaps you meant http:////imgs.xkcd.com/comics/the_martian.png?

Le fait est que j'ai lu la section du livre à plusieurs reprises sur le programme, lu le document Requests, ainsi que regardé d'autres questions ici. Ma syntaxe semble correcte.

Merci de votre aide!

Éditer:

Cela n'a pas fonctionné:

comicUrl = ("http:"+comicElem[0].get('src')) 

Je pensais que l'ajout de http: avant éliminerait l'erreur sans schéma fourni.

10
Loi Huynh

changez votre comicUrl en ceci

comicUrl = comicElem[0].get('src').strip("http://")
comicUrl="http://"+comicUrl
if 'xkcd' not in comicUrl:
    comicUrl=comicUrl[:7]+'xkcd.com/'+comicUrl[7:]

print "comic url",comicUrl
9
Ajay

Aucun schéma ne signifie que vous n'avez pas fourni le http:// ou https:// fournissez-les et cela fera l'affaire.

Edit: Regardez cette chaîne URL!:

URL '//imgs.xkcd.com/comics/the_martian.png':

12
John

Explication:

Quelques pages XKCD ont un contenu spécial qui n'est pas un simple fichier image. C'est très bien; vous pouvez simplement les ignorer. Si votre sélecteur ne trouve aucun élément, soup.select ('# comic img') renverra une liste vierge.

Code de travail:

import requests,os,bs4,shutil

url='http://xkcd.com'

#making new folder
if os.path.isdir('xkcd') == True:
    shutil.rmtree('xkcd')
else:
    os.makedirs('xkcd')


#scrapiing information
while not url.endswith('#'):
    print('Downloading Page %s.....' %(url))
    res = requests.get(url)          #getting page
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text)

    comicElem = soup.select('#comic img')     #getting img tag under  comic divison
    if comicElem == []:                        #if not found print error
        print('could not find comic image')

    else:
        try:
            comicUrl = 'http:' + comicElem[0].get('src')             #getting comic url and then downloading its image
            print('Downloading image %s.....' %(comicUrl))
            res = requests.get(comicUrl)
            res.raise_for_status()

        except requests.exceptions.MissingSchema:
        #skip if not a normal image file
            prev = soup.select('a[rel="prev"]')[0]
            url = 'http://xkcd.com' + prev.get('href')
            continue

        imageFile = open(os.path.join('xkcd',os.path.basename(comicUrl)),'wb')     #write  downloaded image to hard disk
        for chunk in res.iter_content(10000):
            imageFile.write(chunk)
        imageFile.close()

        #get previous link and update url
        prev = soup.select('a[rel="prev"]')[0]
        url = "http://xkcd.com" + prev.get('href')


print('Done...')
1
Admiral Gaust

Je voudrais juste carilloner ici que j'ai eu exactement la même erreur et utilisé la réponse recommandée @Ajay ci-dessus, mais même après avoir ajouté que je continuais à avoir des problèmes, juste après que le programme ait téléchargé la première image, il s'arrêterait et retournerait cette erreur:

ValueError: Unsupported or invalid CSS selector: "a[rel"

cela faisait référence à l'une des dernières lignes du programme où il utilise le "bouton Précédent" pour passer à l'image suivante à télécharger.

Quoi qu'il en soit, après avoir parcouru les documents bs4, j'ai apporté un léger changement comme suit et cela semble fonctionner très bien maintenant:

prevLink = soup.select('a[rel^="prev"]')[0]

Quelqu'un d'autre pourrait rencontrer le même problème, alors j'ai pensé ajouter ce commentaire.

0
easy_c0mpany80