2017-03-06 1 views
0

Ich versuche Quellen aus <iframes> Attribute wie diese zu extrahieren:Python - Valueerror: unbekannt url Typ

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>] 

aber wenn ich versuche, es zu extrahieren:

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

ich folgende Fehlermeldung erhalten :

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 

warum ich url bin immer ohne http vor dem //www?

Gibt es eine Umgehungsmöglichkeit?

+0

Wenn Websites SSL-Zertifikate (HTTPS) verwenden, ist eine sichere Methode zum Entfernen von Fehlern und unsicheren Verbindungen: "//facebook.com", die die Verbindung entweder http oder https übernimmt. Versuchen Sie, 'https:' vor die URL-Variable zu setzen und sehen Sie, ob es so funktioniert. – Lewis

Antwort

2

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

Dies ist eine gängige Methode, um die User-Agenten, um anzuzeigen, dass es nach dem gleichen Schema (http, https, ftp, file, etc.) wie die aktuelle Seite verwendet werden soll, wenn eine nachfolgende Anforderung zu machen. Wenn Sie zum Beispiel die aktuelle Seite über https geladen haben, wird auf die URLs, die das Schema nicht enthalten, https zugegriffen.

Is there some workaround this?

können Sie das urlparse Modul verwenden diese 2 in Python zu behandeln (da, dass Ihre Version von Python ist):

# 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 

Wenn Sie den obigen Code ausführen, sollten Sie diese Ausgabe sehen:

 
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 

, die zeigt, dass das Standardschema auf die URL angewendet wurde.