2

因此,我正在尝试更熟悉 Python 网络抓取,并且我正在尝试仅为特定功能查找外部链接。在我正在阅读的书中,作者通过简单地从字符串中删除“http://”然后查看新链接是否包含新字符串(这是没有前面的“http://”的域名来实现这一点.

我可以看到这段代码是如何失败的,虽然我可以简单地编写一个 if 语句,但它确实让我想知道 - 有没有办法匹配所有以“http”开头但不以“http(s)://domain. com”?我尝试了许多我认为可行的不同正则表达式解决方案,但它们没有。例如,变量“site”包含链接地址。

re.compile("^((?!"+site+").)^http|www*$"))
re.compile("^http|www((?!"+site+").)*$"))

我得到的结果只是所有以 http 或 www 开头的链接,这不是我打算做的。同样,我可以用 if 语句很好地实现它并过滤结果,这不是一个完整的阻止程序,但我很好奇这种可能性的存在

任何帮助,将不胜感激。我环顾网络,但找不到任何与我的用例相匹配的东西。

4

2 回答 2

2

我不建议您使用regex此任务,但我建议您使用urlparsefrom urllib.parsemodule。

这是一个例子:

$> from urllib.parse import urlparse
$> url = urlparse('https://google.com') 
ParseResult(scheme='https', netloc='google.com', path='', params='', query='', fragment='')
$> url.scheme
'https'
$> url.netloc
'google.com'
$> urlparse('https://www.google.com')
ParseResult(scheme='https', netloc='www.google.com', path='', params='', query='', fragment='')
于 2020-03-27T18:37:29.633 回答
1

要匹配以一个字符串开头但不以另一个字符串开头的字符串,您应该使用以下模式:

^(?!stringyoudontwant)stringyouwant.*

所以在你的情况下,这将是:

^(?!https?:\/\/domain\.com)http.*

对于这类事情,您可以查看https://regex101.com,这是尝试复杂正则表达式的完美界面。

于 2020-03-27T18:33:27.170 回答