使用python3提取字符串中的所有url

Ous*_*uss 4 python regex url python-3.x

我正在尝试找到一种干净的方法来提取文本字符串中的所有网址。

经过广泛的搜索后,我发现许多帖子建议使用正则表达式来完成任务,并且他们给出了应该执行此操作的正则表达式。每个正则表达式都有一些优点和一些缺点。此外,编辑它们以改变它们的行为并不简单。无论如何,此时我对任何可以正确检测此文本中的 url 的正则表达式感到满意:

输入:

Lorem ipsum dolor sat amet https://www.lorem.com/ipsum.php?q=suas,nusquamtincidunt ex per,ius modus integre no,quando utroque placerat qui no。我的结论是 vituperatoribus et, omnes malorum est id, pri omnesatomorum expetenda ex。Elit pertinacia no eos,nonumy comprehensam id mei。Ei eum maiestatis quaerendum https://www.lorem.org。Pri posse constituam in,请坐http://news.bbc.co.uk全方位定义em ei。Cu duo equidem meliore qualisque。

输出:

[ ' https://www.lorem.com/ipsum.php?q=suas','https://www.lorem.org','http://news.bbc.co.uk ' ]​​

但是,如果有一个 python3 类/函数/库,它会查找给定文本中的所有 url 并采用参数:

  1. 选择要检测的协议
  2. 选择允许的 TLD
  3. 选择允许哪些域

我很高兴知道这件事。

小智 6

除了其他人提到的之外,由于您要求的内容已经存在,因此您可能想尝试URLExtract

显然,它试图查找给定文本中出现的任何TLD。如果找到 TLD,它将从该位置开始向两侧扩展边界,搜索“停止字符”(通常是空格、逗号、单引号或双引号)。

这里有几个例子。

from urlextract import URLExtract

extractor = URLExtract()
urls = extractor.find_urls("Let's have URL youfellasleepwhilewritingyourtitle.com as an example.")
print(urls) # prints: ['youfellasleepwhilewritingyourtitle.cz']
Run Code Online (Sandbox Code Playgroud)

看来这个模块还有一个update()方法可以让你更新TLD列表缓存文件

但是,如果这不符合您的特定要求,您可以在使用上述模块(或任何其他解析 URL 的方式)处理 URL 后手动执行一些检查。例如,假设您获得 URL 列表:

result = ['https://www.lorem.com/ipsum.php?q=suas', 'https://www.lorem.org', 'http://news.bbc.co.uk'] 
Run Code Online (Sandbox Code Playgroud)

然后,您可以构建另一个列表来保存排除的域/TLD/等:

allowed_protocols = ['protocol_1', 'protocol_2']
allowed_tlds = ['tld_1', 'tld_2', 'tld_3']
allowed_domains = ['domain_1']

for each_url in results:
    # here, check each url against your rules
Run Code Online (Sandbox Code Playgroud)