2017-03-06 3 views
0

Je suis en train d'extraire les sources de <iframes> attributs comme ceux-ci:Python - ValueError: type url inconnu

iframes = [<iframe frameborder="no" height="160px" scrolling="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/308197184%3Fsecret_token%3Ds-VtArH&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true" width="100%"></iframe>, <iframe allowtransparency="true" frameborder="0" scrolling="no" src="//www.facebook.com/plugins/likebox.php?href=https%3A%2F%2Fwww.facebook.com%2FPauseMusicale&amp;width=300&amp;height=62&amp;show_faces=false&amp;colorscheme=light&amp;stream=false&amp;show_border=false&amp;header=false" style="border:none; overflow:hidden; width:300px; height:62px;"></iframe>, <iframe allowfullscreen="" frameborder="0" height="169" src="//www.youtube.com/embed/videoseries?list=PLNKCTdT9YSESoQnj5tPP4P9kaIwBCx7F1" width="100%"></iframe>] 

mais lorsque je tente de l'extraire:

for iframe in iframes: 
    url = urllib2.urlopen(iframe.attrs['src']) 
    print (url) 

Je reçois l'erreur suivante :

url = urllib2.urlopen(iframe.attrs['src']) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 154, in urlopen 
    return opener.open(url, data, timeout) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 423, in open 
    protocol = req.get_type() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 285, in get_type 
    raise ValueError, "unknown url type: %s" % self.__original 
ValueError: unknown url type: //www.facebook.com/plugins/likebox.php?href=https%3A%2F%2Fwww.facebook.com%2FPauseMusicale&width=300&height=62&show_faces=false&colorscheme=light&stream=false&show_border=false&header=false 

Pourquoi ai-je url sans http avant la //www?

Y at-il une solution de contournement?

+0

Lorsque des sites Web utilisant des certificats SSL (HTTPS), un moyen sûr de supprimer les erreurs et les connexions non sécurisées est de faire: "//facebook.com" qui prendra la connexion si c'est http ou https. Essayez de mettre 'https:' avant la variable url et voyez si cela fonctionne comme ça. – Lewis

Répondre

2

why am I getting url with no http before the //www

Ceci est une façon courante d'indiquer à l'agent utilisateur qu'il doit utiliser le même schéma (http, https, ftp, fichier, etc.) comme la page courante lors d'une demande ultérieure. Ainsi, par exemple, si vous avez chargé la page en cours sur https, les URL qui omettent le schéma seront accessibles avec https.

Is there some workaround this?

Vous pouvez utiliser le module urlparse pour gérer ce en Python 2 (puisque c'est votre version de Python):

# from urllib.parse import urlparse, urlunparse # Python 3 
from urlparse import urlparse, urlunparse 

for iframe in iframes: 
    scheme, netloc, path, params, query, fragment = urlparse(iframe.attrs['src']) 
    if not scheme: 
     scheme = 'http' # default scheme you used when getting the current page 
    url = urlunparse((scheme, netloc, path, params, query, fragment)) 
    print('Fetching {}'.format(url)) 
    f = urllib2.urlopen(url) 
# print(f.read()) # dumps the response content 

Si vous exécutez le code ci-dessus, vous devriez voir cette sortie:

 
Fetching https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/308197184%3Fsecret_token%3Ds-VtArH&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true 
Fetching http://www.facebook.com/plugins/likebox.php?href=https%3A%2F%2Fwww.facebook.com%2FPauseMusicale&width=300&height=62&show_faces=false&colorscheme=light&stream=false&show_border=false&header=false 
Fetching http://www.youtube.com/embed/videoseries?list=PLNKCTdT9YSESoQnj5tPP4P9kaIwBCx7F1 

qui montre que le schéma par défaut a été appliqué à l'URL.