TL;DR:实际上你不能。给出的每个答案都已经错过了 1 个或多个案例。
- 字符串是google.com(无效,因为没有方案,即使浏览器默认采用 http)。Urlparse 将缺少方案和 netloc。所以
all([result.scheme, result.netloc, result.path])
似乎适用于这种情况
- 字符串为http://google(由于 .com 缺失而无效)。Urlparse 将仅缺少路径。
all([result.scheme, result.netloc, result.path])
似乎再次抓住了这个案例
- 字符串是http://google.com/(正确)。Urlparse 将填充方案、netloc 和路径。因此,对于这种情况,
all([result.scheme, result.netloc, result.path])
效果很好
- 字符串是http://google.com(正确)。Urlparse 将仅缺少路径。所以对于这种情况
all([result.scheme, result.netloc, result.path])
似乎给出了假阴性
因此,从上述案例中,您可以看到最接近解决方案的案例是all([result.scheme, result.netloc, result.path])
. 但这仅适用于 url 包含路径的情况(即使那是 / 路径)。
即使您尝试强制执行路径(即urlparse(urljoin(your_url, "/"))
,在案例 2 中您仍然会得到误报
也许更复杂的东西,比如
final_url = urlparse(urljoin(your_url, "/"))
is_correct = (all([final_url.scheme, final_url.netloc, final_url.path])
and len(final_url.netloc.split(".")) > 1)
也许您还想跳过方案检查并假设 http 如果没有方案。但即使这样也会让你达到一定程度。尽管它涵盖了上述情况,但并未完全涵盖 url 包含 ip 而不是主机名的情况。对于这种情况,您必须验证 ip 是正确的 ip。还有更多的场景。请参阅https://en.wikipedia.org/wiki/URL以思考更多案例