【问题标题】:Python - ValueError: unknown url typePython - ValueError:未知的网址类型
【发布时间】:2017-03-06 02:09:02
【问题描述】:

我正在尝试从<iframes> 属性中提取来源,如下所示:

   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

为什么我得到的网址在//www 之前没有http

有解决办法吗?

【问题讨论】:

  • 当网站使用 SSL 证书 (HTTPS) 时,删除错误和不安全连接的安全方法是:“//facebook.com”,如果它是 http 或 https,它将采用连接。尝试将https: 放在 url 变量之前,看看它是否可以这样工作。

标签: python iframe urllib2


【解决方案1】:

为什么我在 //www 之前得到没有 http 的 url

这是向用户代理指示它在发出后续请求时应使用与当前页面相同的方案(http、https、ftp、文件等)的常用方法。因此,例如,如果您通过 https 加载当前页面,那么那些省略该方案的 URL 将使用 https 访问。

有解决办法吗?

您可以在 Python 2 中使用 urlparse 模块来处理这个问题(因为那是您的 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

如果你运行上面的代码,你应该会看到这个输出:

获取 https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/308197184%3Fsecret_token%3Ds-VtArH&auto_play=false&hide_related=false&show_cmets=true&show_user=true&show_reposts=false&visual=true 获取 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 获取 http://www.youtube.com/embed/videoseries?list=PLNKCTdT9YSESoQnj5tPP4P9kaIwBCx7F1

这表明默认方案已应用于 URL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 2018-01-02
    • 2021-03-11
    • 2020-10-29
    • 2021-05-11
    • 2018-12-16
    • 2015-09-04
    • 2020-03-06
    相关资源
    最近更新 更多