【问题标题】:Python - Parsing a string for URLs and extracting themPython - 解析 URL 的字符串并提取它们
【发布时间】:2011-07-18 20:57:09
【问题描述】:

我知道使用 urllib 可以解析字符串并检查它是否是有效的 URL。但是如何去检查一个句子中是否包含一个 URL,然后提取那个 URL。我已经看到了一些巨大的正则表达式,但我宁愿不使用我真的无法理解的东西。

所以基本上我有一个输入字符串,我需要找到并提取该字符串中的所有 URL。

什么是解决这个问题的干净方法。

【问题讨论】:

  • 如果您的输入源是 html 或 xml,请不要这样做,而是使用适当的解析器。
  • 你能发布一个典型的示例输入吗?
  • URL 匹配是一个相当大的话题,有很多规则......这就是为什么你发现的所有正则表达式都很大并且难以理解。尝试检查此正则表达式(拆分以匹配各种 URL 部分):stackoverflow.com/questions/9760588/…

标签: python regex url urlparse


【解决方案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(即 Link! )

其次,当涉及到验证 URI/URL 时,您要查看的文档是RFC-3986。我一直在写一篇关于这个主题的文章:Regular Expression URI Validation。您可能也想看看这个。

但是当你真正开始的时候,这不是一件小事!

【讨论】:

    【解决方案2】:

    您可以搜索包含: 的“单词”,然后将它们传递给urlparse(在Python 3.0 及更高版本中重命名为urllib.parse)以检查它们是否是有效的URL。

    例子:

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

    如果您只想将自己限制在以 http://https:// (或您希望允许的任何其他内容)开头的 URL,您也可以使用正则表达式来执行此操作,例如:

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

    您可能还想使用一些启发式方法来确定 URL 的开始和停止位置,因为有时人们会在 URL 中添加标点符号,从而提供新的有效但无意中不正确的 URL,例如:

    您看到http://example.com/ 的新外观了吗?这完全是对http://example.org/的盗版!

    此处 URL 后面的标点不打算成为 URL 的一部分。从上述文本中自动添加的链接可以看出,StackOverflow 实现了这样的启发式。

    【讨论】:

    • :// 很常见,但 URL 可能根本不包含 ://RFC here.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多