python:检查是否存在url到jpg

时间:2010-03-21 06:09:18

标签: python url validation

在python中,我如何检查以.jpg结尾的网址是否存在?

例如: http://www.fakedomain.com/fakeImage.jpg

感谢

10 个答案:

答案 0 :(得分:32)

>>> import httplib
>>>
>>> def exists(site, path):
...     conn = httplib.HTTPConnection(site)
...     conn.request('HEAD', path)
...     response = conn.getresponse()
...     conn.close()
...     return response.status == 200
...
>>> exists('http://www.fakedomain.com', '/fakeImage.jpg')
False

如果状态不是200,则URL中不存在该资源。这并不意味着它完全消失了。如果服务器返回301或302,则表示该资源仍然存在,但位于不同的URL。要更改处理此案例的功能,只需将状态检查行更改为return response.status in (200, 301, 302)

答案 1 :(得分:30)

以下代码相当于tikiboy's answer,但使用的是高级且易于使用的requests库。

import requests

def exists(path):
    r = requests.head(path)
    return r.status_code == requests.codes.ok

print exists('http://www.fakedomain.com/fakeImage.jpg')

requests.codes.ok等于200,因此您可以根据需要替换确切的状态代码。

如果服务器没有响应,

requests.head可能会抛出exception,因此您可能需要添加try-except结构。

此外,如果您想要包含代码301302,请考虑代码303,尤其是dereference URIs代表Linked Data中的资源时。 URI可以代表某个人,但您无法下载某个人,因此服务器会将您重定向到使用303 redirect来描述此人的网页。

答案 2 :(得分:7)

感谢所有人的回复,最后使用以下内容:

try:
  f = urllib2.urlopen(urllib2.Request(url))
  deadLinkFound = False
except:
  deadLinkFound = True

答案 3 :(得分:4)

看起来http://www.fakedomain.com/fakeImage.jpg会自动重定向到http://www.fakedomain.com/index.html而不会出现任何错误。

自动完成301和302响应的重定向,而不向用户提供任何响应。

请查看HTTPRedirectHandler,您可能需要将其子类化以处理它。

以下是Dive Into Python中的一个示例:

http://diveintopython3.ep.io/http-web-services.html#redirects

答案 4 :(得分:4)

当文件位于ftp服务器(ftp://url.com/file)时,以前的答案存在问题,当文件位于ftp,http或https时,以下代码有效:

import urllib2

def file_exists(url):
    request = urllib2.Request(url)
    request.get_method = lambda : 'HEAD'
    try:
        response = urllib2.urlopen(request)
        return True
    except:
        return False

答案 5 :(得分:1)

使用mechanize尝试:

import mechanize
br = mechanize.Browser()
br.set_handle_redirect(False)
try:
 br.open_novisit('http://www.fakedomain.com/fakeImage.jpg')
 print 'OK'
except:
 print 'KO'

答案 6 :(得分:0)

这可能足以查看文件的URL是否存在。

def cmd_split(s)
    rx = /(?<command>[^<>\s]+)(<(?<args>(\d+)+(?:,\s*\d+)*)>)?/
    res = []
    s.scan(rx) { 
        res << ($~[:args] != nil ? 
            Hash["command", $~[:command], "args", $~[:args].split(/,\s*/)] : 
            Hash[$~[:command], ""]) }
    return res
end

puts cmd_split("print<1, 2, 3>") # => {"command"=>"print", "args"=>["1", "2", "3"]}
puts cmd_split("disp<1>")        # => {"command"=>"disp", "args"=>["1"]}
puts cmd_split("+")              # => {"+"=>""}

答案 7 :(得分:0)

在Python 3.6.5中:

import http.client

def exists(site, path):
    connection =  http.client.HTTPConnection(site)
    connection.request('HEAD', path)
    response = connection.getresponse()
    connection.close()
    return response.status == 200

exists("www.fakedomain.com", "/fakeImage.jpg")

在Python 3中,模块httplib已重命名为http.client

您需要从URL中删除http://https://,因为httplib会将:视为端口号,并且该端口号必须是数字。 / p>

答案 8 :(得分:0)

Python3

import requests

def url_exists(url):
    """Check if resource exist?"""
    if not url:
        raise ValueError("url is required")
    try:
        resp = requests.head(url)
        return True if resp.status_code == 200 else False
    except Exception as e:
        return False

答案 9 :(得分:-1)

我认为您可以尝试向网址发送http请求并阅读响应。如果没有捕获到异常,则可能存在。