2011-03-19 55 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您可能需要采取看看这个吧。

但是当你开始做这件事的时候,这不是一项简单的工作!