如何正确操作 python 中的相对 URL?

How to properly manipulate relative URLs in python?

我最近在做网络爬虫。在那个项目中,当我的爬虫收集站点中的链接时,有些 URLs 就像; about.html , /pages , #form-login , javascript:validate(); , ../help , ../../ , ./ .

我试过 urllib 的 urlparse 、 urljoin 和 os 模块的连接函数。然而,下面给出的是我项目中与问题相关的部分代码。


from urllib.parse import urlparse, urljoin

base_url = input('Enter base url : ')


def make_links(link):
    u = urlparse(link)
    if link[:3] == 'www':
        link = u['scheme'] + link
    elif link[:1] == '/':
        link = base_url + link
    elif link[:3] == '../':
        link = urljoin(base_url, link)
    elif link[:2] == './':
        link = urljoin(base_url, link)
        link = base_url + '/' + link
    print(link)


while True:
    i = input("Enter your url : ")
    if i == 'exit':
        break
    else:
        make_links(i)

我除了用户输入的相对 URL 的输出与用户输入的基数 URL 相关。当用户输入绝对 URL 作为 base_url,然后当用户输入相对 URL 时,输出应该是用户可以访问 Web 的绝对 URL 路径通过浏览器翻页。该程序还应该支持任何类型的亲戚 URL。如果你想知道相对 URLs 的表示方式,参考这个,

http://webreference.com/html/tutorial2/3.html

It should not execute javascript when the program comes across URLs like javascript:alert('foo-bar')

urljoin 为您完成了大部分繁重的工作。因此,像这样简单的事情就可以解决问题:

def make_links(link):
    url = urljoin(base_url, link)
    parsed = urlparse(url)
    if not parsed.scheme or not parsed.scheme.startswith('http'):
        # invalid, e.g. javascript, etc.
        return None
    return url

示例:

Enter base url : http://example.com/dir1/file.php
Enter your url : ../dir2
http://example.com/dir2
Enter your url : #hello
http://example.com/dir1/file.php#hello
Enter your url : javascript: return false
None
Enter your url : /world
http://example.com/world
Enter your url : www.test.com
http://example.com/dir1/www.test.com
Enter your url : http://www.test.com
http://www.test.com

如您所见,唯一的缺点是必须以 http 开头 url。这实际上是有道理的,因为没有严格的规定:网站可以使用 www 作为子资源...