Например:Как извлечь URL-адрес из строки с помощью python?
string = "This is a link http://www.google.com"
Как я мог извлечь 'http://www.google.com'?
(Каждая ссылка будет иметь тот же формат, т.е. «HTTP: //»)
Например:Как извлечь URL-адрес из строки с помощью python?
string = "This is a link http://www.google.com"
Как я мог извлечь 'http://www.google.com'?
(Каждая ссылка будет иметь тот же формат, т.е. «HTTP: //»)
Там может быть несколько способов сделать это, но чистейшая будет использовать регулярное выражение
>>> myString = "This is a link http://www.google.com"
>>> print re.search("(?P<url>https?://[^\s]+)", myString).group("url")
http://www.google.com
Если есть может быть несколько ссылок, которые можно использовать что-то подобное ниже
>>> myString = "These are the links http://www.google.com and http://stackoverflow.com/questions/839994/extracting-a-url-in-python"
>>> print re.findall(r'(https?://[^\s]+)', myString)
['http://www.google.com', 'http://stackoverflow.com/questions/839994/extracting-a-url-in-python']
>>>
Это слишком грубо для многих реальных сценариев. Он полностью не подходит для 'ftp: //' URL-адресов и 'mailto:' URL и т. Д., И будет наивно захватывать хвостовую часть от 'Click here' (т. Е. Через« щелчок »). – tripleee
@ tripleee Вопрос заключается не в разборе HTML, а в поиске URL-адреса в строке текста, которая всегда будет форматом 'http'. Так что это действительно хорошо. Но да, очень важно, чтобы люди знали, что вы говорите, если они здесь, для разбора HTML или подобного. – teewuane
для того, чтобы найти веб-адрес в общей строке, вы можете использовать regular expression (regex).
Простое регулярное выражение для сопоставления URL-адресов, как показано ниже, должно соответствовать вашему делу.
regex = r'('
# Scheme (HTTP, HTTPS, FTP and SFTP):
regex += r'(?:(https?|s?ftp):\/\/)?'
# www:
regex += r'(?:www\.)?'
regex += r'('
# Host and domain (including ccSLD):
regex += r'(?:(?:[A-Z0-9][A-Z0-9-]{0,61}[A-Z0-9]\.)+)'
# TLD:
regex += r'([A-Z]{2,6})'
# IP Address:
regex += r'|(?:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})'
regex += r')'
# Port:
regex += r'(?::(\d{1,5}))?'
# Query path:
regex += r'(?:(\/\S+)*)'
regex += r')'
Если вы хотите быть еще более точным, в разделе TLD, вы должны убедиться, что TLD является действительным TLD (см всего списка допустимой ДВОЙ здесь: https://data.iana.org/TLD/tlds-alpha-by-domain.txt):
# TLD:
regex += r'(com|net|org|eu|...)'
Затем, вы можете просто скомпилировать бывший регулярное выражение и использовать его, чтобы найти возможные совпадения:
import re
string = "This is a link http://www.google.com"
find_urls_in_string = re.compile(regex, re.IGNORECASE)
url = find_urls_in_string.search(string)
if url is not None and url.group(0) is not None:
print("URL parts: " + str(url.groups()))
print("URL" + url.group(0).strip())
Который, в случае строки «Это ссылка http://www.google.com "выход будет:
URL parts: ('http://www.google.com', 'http', 'google.com', 'com', None, None)
URL: http://www.google.com
При изменении входа с более сложной URL, например „Это также URL https://www.host.domain.com:80/path/page.php?query=value&a2=v2#foo, но это не больше“ выхода будет:
URL parts: ('https://www.host.domain.com:80/path/page.php?query=value&a2=v2#foo', 'https', 'host.domain.com', 'com', '80', '/path/page.php?query=value&a2=v2#foo')
URL: https://www.host.domain.com:80/path/page.php?query=value&a2=v2#foo
ПРИМЕЧАНИЕ. Если вы ищете больше URL-адресов в одной строке, вы все равно можете использовать одно и то же регулярное выражение, но просто используйте findall() вместо search().
Итак, регулярное выражение оказывается '((? :(https? | S? Ftp): \/\ /)? (?: www \.)? ((?: (?: [A-Z0-9] [А-Z0-9 -] {0,61} [А-Z0-9] \) +) ([AZ] {2,6}) | (:.?. \ д {1,3} \ \ д . {1,3} \ \ д {1,3} \ \ д {1,3})) (:: (\ d {1,5})) (:.??? (\/\ S +) *)) '. Также обратите внимание на [список TLD] (https://data.iana.org/TLD/tlds-alpha-by-domain.txt) прямо сейчас также включает забавные окончания, такие как «XN - VERMGENSBERATUNG-PWB», длиной 24 символа , который не будет улавливаться этим. – luckydonald
Было бы лучше добавить '(? I)' к шаблону - более портативный. Кроме того, имейте в виду, что это будет соответствовать «23.084.828.566», который не является допустимым IP-адресом, но является допустимым поплавком в некоторых локалях. –
Существует другой способ, как извлечь URL из текста легко. Вы можете использовать urlextract, чтобы сделать это для вас, просто установить его через пип:
pip install urlextract
, а затем вы можете использовать его как это:
from urlextract import URLExtract
extractor = URLExtract()
urls = extractor.find_urls("Let's have URL stackoverflow.com as an example.")
print(urls) # prints: ['stackoverflow.com']
Вы можете найти более подробную информацию на моей странице GitHub: https://github.com/lipoja/URLExtract
ПРИМЕЧАНИЕ. Он загружает список TLD из iana.org, чтобы поддерживать вас в курсе последних событий. Но если у программы нет доступа в Интернет, это не для вас.
Вы можете проверить этот ответ: HTTP: // StackOverflow.com/questions/499345/regular-expression-to-extract-url-from-an-html-link – rjz
При возврате этого решения ничего не возвращается. – Sheldon
Если это для необработанного текстового файла (как указано в вашем вопросе), вы можете проверить этот ответ: http://stackoverflow.com/questions/839994/extracting-a-url-in-python –