答案 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结构。
此外,如果您想要包含代码301
和302
,请考虑代码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请求并阅读响应。如果没有捕获到异常,则可能存在。