proyectos ejemplos python url validation

ejemplos - python: verifica si existe url a jpg



django (10)

En Python, ¿cómo puedo verificar si existe una url que termina en .jpg?

ej: http://www.fakedomain.com/fakeImage.jpg

Gracias


Creo que puede intentar enviar una solicitud http a la url y leer la respuesta. Si no se detectó una excepción, es probable que exista.


El código a continuación es equivalente a la respuesta de tikiboy , pero utilizando una biblioteca de requests alto nivel y fácil de usar.

import requests def exists(path): r = requests.head(path) return r.status_code == requests.codes.ok print exists(''http://www.fakedomain.com/fakeImage.jpg'')

El requests.codes.ok es igual a 200 , por lo que puede sustituir el código de estado exacto si lo desea.

requests.head puede generar una exception si el servidor no responde, por lo que es posible que desee agregar una construcción try-except.

Además, si desea incluir los códigos 301 y 302 , considere también el código 303 , especialmente si no hace referencia a los URI que denotan recursos en los datos vinculados . Un URI puede representar a una persona, pero no puede descargar a una persona, por lo que el servidor lo redireccionará a una página que describe a esta persona utilizando 303 redirect .


Esto podría ser lo suficientemente bueno para ver si existe una url para un archivo.

import urllib if urllib.urlopen(''http://www.fakedomain.com/fakeImage.jpg'').code == 200: print ''File exists''


Gracias por todas las respuestas a todos, terminamos usando lo siguiente:

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


Hay problemas con las respuestas anteriores cuando el archivo está en el servidor ftp ( ftp://url.com/file ), el siguiente código funciona cuando el archivo está en ftp, http o 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


No sé por qué está haciendo esto, pero en cualquier caso: debe tenerse en cuenta que solo porque una solicitud a una "imagen" tenga éxito, no significa que sea lo que cree que es (podría redirigirse a cualquier cosa, o devuelva cualquier dato de cualquier tipo, y posiblemente cause problemas dependiendo de lo que haga con la respuesta).

Perdón, hice una lectura compulsiva sobre las hazañas en línea y cómo defenderme hoy: P


Parece que http://www.fakedomain.com/fakeImage.jpg se redirige automáticamente a http://www.fakedomain.com/index.html sin ningún error.

La redirección para 301 y 302 respuestas se realiza automáticamente sin devolver ninguna respuesta al usuario.

Por favor, eche un vistazo a HTTPRedirectHandler , puede que tenga que subclasificarlo para manejar eso.

Aquí está una muestra de Dive Into Python:

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


Pruébalo con 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''


en 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")

En Python 3, el módulo httplib ha sido renombrado a http.client

Y necesita eliminar http:// y https:// de su URL, ya que httplib está considerando : como número de puerto y el número de puerto debe ser numérico.


>>> 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

Si el estado es diferente a 200, el recurso no existe en la URL. Esto no significa que se haya ido por completo. Si el servidor devuelve un 301 o 302, esto significa que el recurso todavía existe, pero en una URL diferente. Para modificar la función para manejar este caso, la línea de verificación de estado solo debe cambiarse para return response.status in (200, 301, 302) .