Recebi url
do usuário e devo responder com o HTML obtido.
Como posso verificar se o URL está malformado ou não?
Por exemplo :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
Como podemos conseguir isso?
python
url
malformedurlexception
Yugal Jindle
fonte
fonte
url='http://google'
não está malformado. Esquema + nome do host é sempre válido.Respostas:
django url validação regex ( fonte ):
fonte
ftp
? Ou tenho uma versão antiga do django?http://[2001:0DB8::3]:8080/index.php?valid=true#result
Na verdade, acho que essa é a melhor maneira.
Se você definir
verify_exists
comoTrue
, ele realmente verificará se a URL existe;edit: ah sim, esta questão é uma duplicata desta: Como posso verificar se existe uma URL com os validadores do Django?
fonte
verify_exists
está obsoleto. -1verify_exists
mais. Além disso, em vez daval
variável, você pode chamá-la comoURLValidator()('http://www.google.com')
Use o pacote de validadores :
Instale-o a partir do PyPI com pip (
pip install validators
).fonte
validators.url("http://localhost:8080") ValidationFailure(func=url, args={'public': False, 'value': 'http://localhost:8080'})
Uma versão verdadeira ou falsa, com base na resposta @DMfll:
Dá:
fonte
True
para a stringfake
ou mesmo para uma string em branco. Nunca haverá erros porque esses atributos estão sempre lá, e a lista sempre terá um valor booleano True porque contém esses atributos. Mesmo se todos os atributos forem Nenhum, a lista ainda não estará vazia. Você precisa de alguma validação dos atributos porque tudo passa da maneira que está agora.print("I am true") if [False, None, 0, '', [], {}] else print("I am false.")
imprime "Eu sou verdadeiro." quando eu o executo.[result.scheme, result.netloc, result.path]
sempre avalia comoTrue
.print("I am True") if [] else print("I am False.")
imprime "Eu sou falso." então listas vazias são falsas. O conteúdo da matriz precisa de avaliação com algo parecido com aall
função.result.path
do teste.scheme
:if not all([result.scheme in ["file", "http", "https"], result.netloc, result.path]):
Hoje utilizo o seguinte, com base na resposta do Padam:
E é assim que parece:
Basta usar
is_url("http://www.asdf.com")
.Espero que ajude!
fonte
https://https://https://www.foo.bar
.observação - o lepl não é mais compatível, desculpe (você pode usá-lo e acho que o código abaixo funciona, mas não receberá atualizações).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html define como fazer isso (para urls http e e-mail). Implementei suas recomendações em python usando lepl (uma biblioteca de analisador). consulte http://acooke.org/lepl/rfc3696.html
usar:
fonte
Aterrissei nesta página tentando descobrir uma maneira sensata de validar strings como urls "válidas". Eu compartilho aqui minha solução usando python3. Nenhuma biblioteca extra necessária.
Consulte https://docs.python.org/2/library/urlparse.html se estiver usando python2.
Consulte https://docs.python.org/3.0/library/urllib.parse.html se você estiver usando python3 como eu.
Aqui está uma função mais concisa:
fonte
EDITAR
Isso é simples e funciona:
Portanto,
min_attr
contém o conjunto básico de strings que precisam estar presentes para definir a validade de uma URL, ou seja,http://
parte egoogle.com
parte.urlparse.scheme
lojashttp://
eurlparse.netloc
armazene o nome de domíniogoogle.com
all()
retorna verdadeiro se todas as variáveis dentro dele retornarem verdadeiras. Portanto, seresult.scheme
eresult.netloc
estiver presente, ou seja, tiver algum valor, a URL é válida e, portanto, retornaTrue
.fonte
https://www.google
é um URL válido. Pode não resolver realmente, mas se você se preocupa com isso, você precisa fazer uma verificação de DNS.Validar URL com
urllib
um regex semelhante ao DjangoO regex de validação de URL do Django era realmente muito bom, mas eu precisava ajustá-lo um pouco para o meu caso de uso. Sinta-se à vontade para adaptá-lo ao seu!
Python 3.7
Explicação
scheme
enetloc
parte de um determinado URL. (Para fazer isso corretamente, eu divido o URLurllib.parse.urlparse()
nas duas partes de acordo com os termos regex correspondentes.)A
netloc
parte para antes da primeira ocorrência de uma barra/
, então osport
números ainda fazem parte donetloc
, por exemplo:Endereços IPv4 também são validados
Suporte IPv6
Se você quiser que o validador de URL também funcione com endereços IPv6, faça o seguinte:
is_valid_ipv6(ip)
de Markus Jarderot , que tem uma regex de validador IPv6 muito boaand not is_valid_ipv6(domain)
ao últimoif
Exemplos
Aqui estão alguns exemplos de regex para a parte
netloc
(akadomain
) em ação:fonte
Todas as soluções acima reconhecem uma string como " http://www.google.com/path,www.yahoo.com/path " como válida. Esta solução sempre funciona como deveria
fonte