Python - анализ строки для URL-адресов и их извлечение - PullRequest
2 голосов
/ 19 марта 2011

Я знаю, что с urllib вы можете проанализировать строку и проверить, является ли она действительным URL. Но как можно проверить, содержит ли предложение URL-адрес внутри него, а затем извлечь этот URL-адрес. Я видел там несколько огромных регулярных выражений, но я бы предпочел не использовать то, что действительно не могу понять.

Так что в основном у меня есть строка ввода, и мне нужно найти и извлечь все URL-адреса в этой строке.

Как правильно это сделать.

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Можно выполнить поиск «слов», содержащих :, а затем передать их в urlparse (переименованный в urllib.parse в Python 3.0 и новее), чтобы проверить, являются ли они действительными URL-адресами.

Пример:

possible_urls = re.findall(r'\S+:\S+', text)

Если вы хотите ограничить себя только URL-адресами, начинающимися с http:// или https:// (или чем-то еще, что вы хотите разрешить), вы также можете сделать это с помощью регулярных выраженийНапример:

possible_urls = re.findall(r'https?://\S+', text)

Вы также можете использовать некоторые эвристические методы для определения того, где начинается и заканчивается URL-адрес, поскольку иногда люди добавляют знаки препинания в URL-адреса, давая новые действительные, но непреднамеренно неправильные URL-адреса, например:

Вы уже видели новый облик http://example.com/? Это общий грабеж http://example.org/!

Здесь пунктуация после URL не предназначена для частиURL.Из автоматически добавленных ссылок в вышеприведенном тексте видно, что StackOverflow реализует такую ​​эвристику.

1 голос
/ 20 марта 2011

Вытащить URL из "дикого" - непростая задача (сделать правильно).Джефф Этвуд написал сообщение в блоге на эту тему: Проблема с URL-адресами Кроме того, Джон Грубер также обратился к этой проблеме: Улучшенный шаблон точных регулярных выражений для сопоставления URL-адресов Также янаписал код, который также пытается решить эту проблему: URL Linkification (HTTP / FTP) (для PHP / Javascript).(Обратите внимание, что мое регулярное выражение является особенно сложным, потому что оно предназначено для применения к разметке HTML и пытается пропустить URL-адреса, которые уже связаны (например, Ссылка! )

Во-вторых, когда это происходитна проверку URI / URL, документ, который вы хотите просмотреть, является RFC-3986 . Я работал над статьей, посвященной этой самой теме: Регулярное выражениеПроверка URI . Возможно, вы также захотите взглянуть на это.

Но когда вы приступите к этому, это не тривиальная задача!

...