2017-03-06 20 views
0

私はこのような<iframes>属性からソースを展開しようとしている:パイソン - ValueErrorを:不明なURLタイプ

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

が、私はそれを抽出しようとすると:

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

私は次のエラーを取得します:

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 

は、なぜ私は前に無httpでURLを取得しています?

いくつかの回避策がありますか?

+0

SSL証明書(HTTPS)を使用しているウェブサイトでは、エラーや安全でない接続を安全に削除する方法として、http:// httpsのいずれかの接続を行う「//facebook.com」があります。 url変数の前に 'https:'を入れて、それがうまくいくかどうか確認してください。 – Lewis

答えて

2

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

これは、後続の要求を行う際には、現在のページと同じスキーム(HTTP、HTTPS、FTP、ファイルなど)を使用するユーザーエージェントに指示する一般的な方法です。たとえば、現在のページをhttpsにロードした場合、スキームを省略したURLはhttpsでアクセスされます。

Is there some workaround this?

(つまりは、Pythonのバージョンだから)あなたは、Python 2でこれを処理するためにurlparseモジュールを使用することができます。

# 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 

あなたは上記のコードを実行する場合は、この出力が表示されるはずです。

 
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 

これは、デフォルトスキームがURLに適用されていることを示しています。

関連する問題