2011-03-19 5 views
2

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

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

Что такое чистый способ обойти это.

+0

Если ваш источник входных данных - html или xml, не делайте этого, используйте вместо этого правильный парсер. – Daenyth

+0

Не могли бы вы разместить типичный пример ввода? –

+0

Согласование URL-адресов - довольно большая тема, с множеством правил ... вот почему все регулярное выражение, которое вы находите, являются большими и трудными для понимания. Попытайтесь проверить это регулярное выражение (разделенное на соответствие различным URL-частям): https://stackoverflow.com/questions/9760588/how-do-you-extract-a-url-from-a-string-using- python/31952097 # 31952097 –

ответ

2

Вы можете найти «слова», содержащие :, а затем передать их 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 реализует такие эвристики.

+0

': //' является общим, но URL-адрес может вообще не содержать ': //'. [RFC здесь] (http://tools.ietf.org/html/rfc1738#section-5). – khachik

+0

Спасибо за полезную ссылку. –

1

Выщипывание URL-адреса из «дикой природы» является сложным делом (делать правильно). Jeff Atwood написал сообщение в блоге на эту тему: The Problem With URLs Кроме того, Джон Грубер также обратился к этой проблеме: An Improved Liberal, Accurate Regex Pattern for Matching URLs Кроме того, я написал код, который также пытается решить эту проблему: URL Linkification (HTTP/FTP) (для PHP/Javascript). (Обратите внимание, что мое регулярное выражение особенно сложно, потому что оно предназначено для применения к разметке HTML и пытается пропустить URL-адреса, которые уже привязаны (например, < a href = "http://example.com" > Ссылка! </a >)

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

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