2011-03-19 111 views
2

我知道用urllib你可以解析一個字符串並檢查它是否是一個有效的URL。但是,如何檢查句子中是否包含URL,然後提取該URL。我已經看到了一些巨大的正則表達式,但我寧願不使用我真正無法理解的東西。Python - 解析URL的字符串並提取它們

所以基本上我有一個輸入字符串,我需要找到並提取該字符串中的所有URL。

什麼是乾淨的方式去做這件事。

+0

如果您的輸入源是html或xml,請不要這樣做,請改用適當的解析器。 – Daenyth 2011-03-19 19:29:30

+0

你能發表一個典型的例子輸入嗎? – 2011-03-19 19:58:33

+0

URL匹配是一個相當大的話題,有很多規則......這就是爲什麼你找到的所有正則表達式都很難理解。 嘗試檢查此正則表達式(即分割以匹配各種URL部分):https://stackoverflow.com/questions/9760588/how-do-you-extract-a-url-from-a-string-using- python/31952097#31952097 – 2015-08-11 21:25:20

回答

2

您可以搜索包含:的「單詞」,然後將它們傳遞給urlparse(在Python 3.0和更高版本中重命名爲urllib.parse)以檢查它們是否是有效的URL。

例子:

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

如果你只想限制自己開始http://https://(或者其他任何你想允許)的網址,你也可以做到這一點與正則表達式,例如:

​​

您可能還想使用一些啓發式方法來確定URL的起止位置,因爲有時候人們會將標點符號添加到URL中,從而給出新的有效但無意的錯誤URL,例如:

您是否看到過http://example.com/的新面貌?這是一個http://example.org/

這裏URL之後的標點符號不是URL的一部分。您可以從上述文本中自動添加的鏈接中看到,StackOverflow實現了這種啓發式。

+0

'://'很常見,但URL可能根本不包含'://'。 [RFC here](http://tools.ietf.org/html/rfc1738#section-5)。 – khachik 2011-03-19 19:31:39

+0

感謝您的有用鏈接。 – 2011-03-19 19:34:06

1

從「野外」中採集URL是一項棘手的工作(要正確)。 Jeff Atwood在這個問題上寫了一篇博文:The Problem With URLs另外,John Gruber也提到了這個問題:An Improved Liberal, Accurate Regex Pattern for Matching URLs另外,我寫了一些代碼,它也試圖解決這個問題:URL Linkification (HTTP/FTP)(用於PHP/Javascript)。 (請注意,我的正則表達式特別複雜,因爲它被設計用於HTML標記,並嘗試跳過已鏈接的URL(即< a href =「http://example.com」> Link!</a > )

其次,當涉及到驗證一個URI/URL,你想要的文件看,就是RFC-3986我一直工作在文章涉及這個主題:。Regular Expression URI Validation您可能需要採取看看這個吧。

但是當你開始做這件事的時候,這不是一項簡單的工作!