python: проверьте, существует ли URL для jpg - PullRequest
26 голосов
/ 21 марта 2010

В Python, как я могу проверить, существует ли URL, заканчивающийся на .jpg?

например: http://www.fakedomain.com/fakeImage.jpg

спасибо

Ответы [ 9 ]

32 голосов
/ 21 марта 2010
>>> 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).

31 голосов
/ 25 октября 2013

Код ниже эквивалентен ответу tikiboy , но с использованием высокоуровневой и простой в использовании запросов библиотеки.

import requests

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

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

The requests.codes.ok равно 200, поэтому вы можете заменить точный код состояния, если хотите.

requests.head может выдать исключение , если сервер не отвечает, поэтому вы можете захотетьдобавьте конструкцию try-exc.

Также, если вы хотите включить коды 301 и 302, рассмотрите также код 303, особенно если вы разыменовываете URI , которые обозначают ресурсы Связанные данные .URI может представлять человека, но вы не можете загрузить человека, поэтому сервер перенаправит вас на страницу, которая описывает этого человека, используя 303 redirect .

7 голосов
/ 22 марта 2010

спасибо за все ответы, в итоге использовали следующее:

try:
  f = urllib2.urlopen(urllib2.Request(url))
  deadLinkFound = False
except:
  deadLinkFound = True
4 голосов
/ 29 марта 2013

Существуют проблемы с предыдущими ответами, когда файл находится на 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
4 голосов
/ 21 марта 2010

Похоже, 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

1 голос
/ 21 марта 2010

Попробуйте с механизировать :

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'
0 голосов
/ 05 сентября 2018

в 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

И вам необходимо удалить http:// и https:// из вашего URL, поскольку httplib рассматривает : в качестве номера порта, а номер порта должен быть числовым.

0 голосов
/ 09 ноября 2016

Этого может быть достаточно, чтобы посмотреть, существует ли URL-адрес файла.

import urllib
if urllib.urlopen('http://www.fakedomain.com/fakeImage.jpg').code == 200:
  print 'File exists'
0 голосов
/ 21 марта 2010

Я думаю, вы можете попробовать отправить http-запрос на URL и прочитать ответ. Если исключение не было обнаружено, оно, вероятно, существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...