Mam url
od użytkownika i muszę odpowiedzieć pobranym kodem HTML.
Jak mogę sprawdzić, czy adres URL jest nieprawidłowy, czy nie?
Na przykład :
url='google' // Malformed
url='google.com' // Malformed
url='http://google.com' // Valid
url='http://google' // Malformed
Jak możemy to osiągnąć?
python
url
malformedurlexception
Yugal Jindle
źródło
źródło
url='http://google'
nie jest zniekształcony. Schemat + nazwa hosta są zawsze prawidłowe.Odpowiedzi:
wyrażenie regularne sprawdzania poprawności adresu URL django ( źródło ):
źródło
ftp
? A może mam starą wersję django?http://[2001:0DB8::3]:8080/index.php?valid=true#result
Właściwie myślę, że to najlepszy sposób.
Jeśli ustawisz
verify_exists
naTrue
, faktycznie zweryfikuje, czy adres URL istnieje, w przeciwnym razie po prostu sprawdzi, czy został poprawnie utworzony.edit: ach tak, to pytanie jest powtórzeniem tego: Jak mogę sprawdzić, czy istnieje adres URL z walidatorami Django?
źródło
verify_exists
jest przestarzałe. -1verify_exists
już nie ma. Również zamiastval
zmiennej możesz ją nazwać jakURLValidator()('http://www.google.com')
Skorzystaj z pakietu walidatorów :
Zainstaluj go z PyPI za pomocą pip (
pip install validators
).źródło
validators.url("http://localhost:8080") ValidationFailure(func=url, args={'public': False, 'value': 'http://localhost:8080'})
Wersja True or False, oparta na odpowiedzi @DMfll:
Daje:
źródło
True
po łańcuchfake
lub nawet po pusty łańcuch. Nigdy nie będzie żadnych błędów, ponieważ te atrybuty są zawsze obecne, a lista zawsze będzie miała wartość logiczną True, ponieważ zawiera te atrybuty. Nawet jeśli wszystkie atrybuty mają wartość Brak, lista nadal nie będzie pusta. Potrzebujesz weryfikacji atrybutów, ponieważ wszystko przebiega tak, jak masz teraz.print("I am true") if [False, None, 0, '', [], {}] else print("I am false.")
„Jestem prawdziwy”. kiedy go uruchomię.[result.scheme, result.netloc, result.path]
zawsze ocenia doTrue
.print("I am True") if [] else print("I am False.")
wyświetla "Nie jestem fałszywy". więc puste listy są fałszywe. Zawartość tablicy wymaga oceny za pomocą czegoś podobnego doall
funkcji.result.path
z testu.scheme
:if not all([result.scheme in ["file", "http", "https"], result.netloc, result.path]):
Obecnie używam następujących, w oparciu o odpowiedź Padama:
A tak to wygląda:
Po prostu użyj
is_url("http://www.asdf.com")
.Mam nadzieję, że to pomoże!
źródło
https://https://https://www.foo.bar
.Uwaga - lepl nie jest już obsługiwany, przepraszam (możesz go używać i myślę, że poniższy kod działa, ale nie otrzyma aktualizacji).
rfc 3696 http://www.faqs.org/rfcs/rfc3696.html definiuje, jak to zrobić (dla adresów URL http i e-maili). Zaimplementowałem jego zalecenia w Pythonie przy użyciu lepl (biblioteki parsera). zobacz http://acooke.org/lepl/rfc3696.html
używać:
źródło
Wylądowałem na tej stronie, próbując znaleźć rozsądny sposób weryfikacji ciągów znaków jako „prawidłowych” adresów URL. Udostępniam tutaj moje rozwiązanie za pomocą python3. Nie są wymagane żadne dodatkowe biblioteki.
Zobacz https://docs.python.org/2/library/urlparse.html jeśli używasz python2.
Zobacz https://docs.python.org/3.0/library/urllib.parse.html, jeśli używasz python3 tak jak ja.
Oto bardziej zwięzła funkcja:
źródło
EDYTOWAĆ
To jest proste i działa:
min_attr
Zawiera więc podstawowy zestaw ciągów, które muszą być obecne, aby określić ważność adresu URL, tj.http://
Część igoogle.com
część.urlparse.scheme
sklepyhttp://
iurlparse.netloc
przechowywać nazwę domenygoogle.com
all()
zwraca prawdę, jeśli wszystkie zmienne wewnątrz niej zwracają prawdę. Więc jeśliresult.scheme
iresult.netloc
jest obecne, tj. Ma jakąś wartość, to adres URL jest prawidłowy i dlatego zwracaTrue
.źródło
https://www.google
to prawidłowy adres URL. Może to nie rozwiązać, ale jeśli Ci na tym zależy, musisz sprawdzić DNS.Sprawdź poprawność adresu URL za pomocą
urllib
i regex podobnego do DjangoWyrażenie regularne sprawdzania poprawności adresu URL w Django było w rzeczywistości całkiem dobre, ale musiałem go trochę poprawić w moim przypadku użycia. Zapraszam do dostosowania go do swojego!
Python 3.7.0
Wyjaśnienie
scheme
inetloc
część podanego adresu URL. (Aby zrobić to poprawnie, rozdzielam adres URLurllib.parse.urlparse()
na dwie części, które są następnie dopasowywane do odpowiednich wyrażeń regularnych).netloc
Część zatrzymuje się przed pierwszym pojawieniem się cięciem/
, więcport
liczba nadal częściąnetloc
, na przykład:Sprawdzane są również adresy IPv4
Obsługa IPv6
Jeśli chcesz, aby walidator adresów URL działał również z adresami IPv6, wykonaj następujące czynności:
is_valid_ipv6(ip)
z odpowiedzią Markusa Jarderot użytkownika , który ma naprawdę dobrą IPv6 walidatora regexand not is_valid_ipv6(domain)
do ostatniegoif
Przykłady
Oto kilka przykładów wyrażenia regularnego dla
netloc
(akadomain
) części w akcji:źródło
Wszystkie powyższe rozwiązania uznają ciąg, taki jak „ http://www.google.com/path,www.yahoo.com/path ”, za prawidłowy. To rozwiązanie zawsze działa tak, jak powinno
źródło