【问题标题】:Unknown url type error in urllib2urllib2 中的未知 url 类型错误
【发布时间】:2014-10-25 18:22:31
【问题描述】:

我在 SO 上搜索了很多类似的问题,但没有找到与我的案例完全匹配的问题。

我正在尝试使用 python 2.7 下载视频

这是我下载视频的代码

import urllib2
from bs4 import BeautifulSoup as bs


with open('video.txt','r') as f:
    last_downloaded_video = f.read()

webpage = urllib2.urlopen('http://*.net/watch/**-'+last_downloaded_video)

soup = bs(webpage)
a = []
for link in soup.find_all('a'):
    if link.has_attr('data-video-id'):
        a.append(link)

#try just with first data-video-id

id = a[0]['data-video-id']
webpage2 = urllib2.urlopen('http://*/video/play/'+id)
soup = bs(webpage2)
string = str(soup.find_all('script')[2])
print string
url = string.split(': ')[1].split(',')[0]
url = url.replace('"','')
print url
print type(url)

video = urllib2.urlopen(url).read()
filename = "video.mp4"
with open(filename,'wb') as f:
    f.write(video)

此代码给出了一个未知的 url 类型错误。回溯是

Traceback (most recent call last):
  File "naruto.py", line 26, in <module>
    video = urllib2.urlopen(url).read()
  File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 404, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 427, in _open
    'unknown_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1247, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib2.URLError: <urlopen error unknown url type: 'http>

但是,当我将相同的 url 存储在变量中并尝试从终端下载它时,不会显示错误。 我对问题所在感到困惑。 我有一个类似的问题in python mailing list

【问题讨论】:

  • print url 语句的输出是什么? url[0] 是什么?它似乎是“'http”(注意字符串开头的额外单引号),在这种情况下,您需要从 URL 中删除它。如果您提供您正在使用的实际 URL,可能会更容易。
  • 打印网址给出“http://oose.io/20a6b47da772361b05d1c4ad3cf1723a5209d0cc/video.mp4”(火影忍者剧集的链接,工作正常)
  • 我故意在 // 后面留了一个空格,因为 http 没有显示出来。

标签: python python-2.7 beautifulsoup urllib2 ubuntu-14.04


【解决方案1】:

如果不从您正在抓取的页面中查看 HTML,很难判断,但是,URL 开头的流浪 '(单引号)字符可能是原因 - 这会导致相同的异常:

>>> import urllib2
>>> urllib2.urlopen("'http://blah.com")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "urllib2.py", line 127, in urlopen
    return _opener.open(url, data, timeout)
  File "urllib2.py", line 404, in open
    response = self._open(req, data)
  File "urllib2.py", line 427, in _open
    'unknown_open', req)
  File "urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "urllib2.py", line 1249, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib2.URLError: <urlopen error unknown url type: 'http>

因此,请尝试清理您的 URL 并删除所有杂散引号。

OP 反馈后更新:

print 语句的结果表明该 URL 在 URL 字符串的开头和结尾都有一个 单引号 字符。在将 URL 传递给 urlopen() 时,不应在 URL 周围有任何类型的 任何 引号。您可以使用以下命令从 URL 字符串中删除前导和尾随引号(单引号和双引号):

url = url.strip('\'"')

【讨论】:

  • 我认为这可能是原因,所以我在获取它之前打印了 url,url 打印为 'http://oose.io/20a6b47da772361b05d1c4ad3cf1723a5209d0cc/video.mp4'
  • 网址是用单引号还是双引号括起来有区别吗?
  • @rahulmr :答案已更新 - 您需要从 url 字符串中删除周围的单引号。
  • 谢谢,我已经做了一个解决方法,比如 url[1:][:-1]。但我有点困惑。当我在终端中传递用引号括起来的 url 时,为什么没有错?
  • 作为命令处理的一部分,shell 会删除周围的引号,因此命令不会看到额外的引号。在您的 Python 程序中,您似乎正在从一些 javascript 中提取 URL,但您并没有删除周围的单引号(您似乎确实删除了双引号)。由于您正在尝试处理 javascript,因此您也许可以使用 json.loads(string) 来获得一个方便的 Python 对象 - 没有看到 javascript 就很难确定。
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2015-01-22
  • 2019-07-22
  • 2020-10-15
相关资源
最近更新 更多