2012-03-18 4 views
8

Например:Как извлечь URL-адрес из строки с помощью python?

string = "This is a link http://www.google.com" 

Как я мог извлечь 'http://www.google.com'?

(Каждая ссылка будет иметь тот же формат, т.е. «HTTP: //»)

+0

Вы можете проверить этот ответ: HTTP: // StackOverflow.com/questions/499345/regular-expression-to-extract-url-from-an-html-link – rjz

+0

При возврате этого решения ничего не возвращается. – Sheldon

+1

Если это для необработанного текстового файла (как указано в вашем вопросе), вы можете проверить этот ответ: http://stackoverflow.com/questions/839994/extracting-a-url-in-python –

ответ

20

Там может быть несколько способов сделать это, но чистейшая будет использовать регулярное выражение

>>> 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'] 
>>> 
+5

Это слишком грубо для многих реальных сценариев. Он полностью не подходит для 'ftp: //' URL-адресов и 'mailto:' URL и т. Д., И будет наивно захватывать хвостовую часть от 'Click here' (т. Е. Через« щелчок »). – tripleee

+0

@ tripleee Вопрос заключается не в разборе HTML, а в поиске URL-адреса в строке текста, которая всегда будет форматом 'http'. Так что это действительно хорошо. Но да, очень важно, чтобы люди знали, что вы говорите, если они здесь, для разбора HTML или подобного. – teewuane

7

для того, чтобы найти веб-адрес в общей строке, вы можете использовать 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().

+1

Итак, регулярное выражение оказывается '((? :(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

+0

Было бы лучше добавить '(? I)' к шаблону - более портативный. Кроме того, имейте в виду, что это будет соответствовать «23.084.828.566», который не является допустимым IP-адресом, но является допустимым поплавком в некоторых локалях. –

5

Существует другой способ, как извлечь 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, чтобы поддерживать вас в курсе последних событий. Но если у программы нет доступа в Интернет, это не для вас.

Смежные вопросы