Lo tengo url
del usuario y tengo que responder con el HTML obtenido.
¿Cómo puedo comprobar si la URL está mal formada o no?
Por ejemplo :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
¿Cómo podemos lograrlo?
python
url
malformedurlexception
Yugal Jindle
fuente
fuente
url='http://google'
no está mal formado. Schema + nombre de host siempre es válido.Respuestas:
regex de validación de URL de django ( fuente ):
fuente
ftp
? ¿O tengo una versión antigua de Django?http://[2001:0DB8::3]:8080/index.php?valid=true#result
De hecho, creo que esta es la mejor forma.
Si se establece
verify_exists
queTrue
, en realidad va a comprobar que existe la URL, de lo contrario sólo comprobar si está correctamente formado.editar: ah sí, esta pregunta es un duplicado de esto: ¿Cómo puedo verificar si existe una URL con los validadores de Django?
fuente
verify_exists
es obsoleto. -1verify_exists
. Además, en lugar de laval
variable, puede llamarlo comoURLValidator()('http://www.google.com')
Utilice el paquete de validadores :
Instálelo desde PyPI con pip (
pip install validators
).fuente
validators.url("http://localhost:8080") ValidationFailure(func=url, args={'public': False, 'value': 'http://localhost:8080'})
Una versión verdadera o falsa, basada en la respuesta de @DMfll:
Da:
fuente
True
para la cadenafake
o incluso para una cadena en blanco. Nunca habrá errores porque esos atributos siempre están ahí, y la lista siempre tendrá un valor booleano de Verdadero porque contiene esos atributos. Incluso si todos los atributos son Ninguno, la lista seguirá sin estar vacía. Necesita cierta validación de los atributos porque todo pasa como lo tiene ahora.print("I am true") if [False, None, 0, '', [], {}] else print("I am false.")
imprime "Soy verdadero". cuando lo ejecuto.[result.scheme, result.netloc, result.path]
siempre evalúa aTrue
.print("I am True") if [] else print("I am False.")
imprime "Soy falso". por lo que las listas vacías son falsas. El contenido de la matriz necesita evaluación con algo como laall
función.result.path
de la prueba.scheme
:if not all([result.scheme in ["file", "http", "https"], result.netloc, result.path]):
Hoy en día, uso lo siguiente, basado en la respuesta de Padam:
Y así es como se ve:
Solo usa
is_url("http://www.asdf.com")
.¡Espero eso ayude!
fuente
https://https://https://www.foo.bar
.nota : lepl ya no es compatible, lo siento (puede usarlo y creo que el código siguiente funciona, pero no recibirá actualizaciones).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html define cómo hacer esto (para http URL y correo electrónico). Implementé sus recomendaciones en Python usando lepl (una biblioteca de analizador). ver http://acooke.org/lepl/rfc3696.html
usar:
fuente
Aterricé en esta página tratando de encontrar una forma sensata de validar cadenas como URL "válidas". Comparto aquí mi solución usando python3. No se requieren bibliotecas adicionales.
Consulte https://docs.python.org/2/library/urlparse.html si está utilizando python2.
Consulte https://docs.python.org/3.0/library/urllib.parse.html si está usando python3 como yo.
Aquí hay una función más concisa:
fuente
EDITAR
Esto es simple y funciona:
Por tanto,
min_attr
contiene el conjunto básico de cadenas que debe estar presente para definir la validez de una URL, es decir,http://
parte ygoogle.com
parte.urlparse.scheme
tiendashttp://
yurlparse.netloc
almacenar el nombre de dominiogoogle.com
all()
devuelve verdadero si todas las variables dentro de él devuelven verdadero. Entonces, siresult.scheme
yresult.netloc
está presente, es decir, tiene algún valor, entonces la URL es válida y, por lo tanto, regresaTrue
.fuente
https://www.google
es una URL válida. Es posible que en realidad no se resuelva, pero si eso le importa, debe hacer una verificación de DNS.Validar URL con
urllib
una expresión regular similar a DjangoLa expresión regular de validación de URL de Django era bastante buena, pero necesitaba modificarla un poco para mi caso de uso. ¡No dudes en adaptarlo al tuyo!
Python 3.7
Explicación
scheme
y lanetloc
parte de una URL determinada. (Para hacer esto correctamente, divido la URLurllib.parse.urlparse()
en las dos partes correspondientes que luego se combinan con los términos de expresiones regulares correspondientes).La
netloc
parte se detiene antes de la primera aparición de una barra/
, por lo que losport
números siguen siendo parte denetloc
, por ejemplo:Las direcciones IPv4 también se validan
Soporte IPv6
Si desea que el validador de URL también funcione con direcciones IPv6, haga lo siguiente:
is_valid_ipv6(ip)
de la respuesta de Markus Jarderot , que tiene una expresión regular de validación de IPv6 realmente buenaand not is_valid_ipv6(domain)
al últimoif
Ejemplos
Aquí hay algunos ejemplos de la expresión regular para la parte
netloc
(también conocida comodomain
) en acción:fuente
Todas las soluciones anteriores reconocen una cadena como " http://www.google.com/path,www.yahoo.com/path " como válida. Esta solución siempre funciona como debería
fuente