【问题标题】:How to properly manipulate relative URLs in python?如何在 python 中正确操作相对 URL?
【发布时间】:2019-12-15 22:43:08
【问题描述】:

这些天我正在研究网络爬虫。在那个项目中,当我的爬虫收集网站中的链接时,一些 URL 类似于; about.html/pages#form-loginjavascript:validate();../help../.././

我已经尝试过 urllib 的 urlparse 、 urljoin 和 os 模块的 join 函数。但是下面给出的是我项目中与问题相关的部分代码。


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 时,输出应该是用户可以通过浏览器访问网页的绝对 URL 路径。该程序还应支持任何类型的相对 URL。如果您想知道相对 URL 的表示方式,请参考这里,

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

当程序遇到javascript:alert('foo-bar') 之类的 URL 时,它不应该执行 javascript ???? ??? ????

【问题讨论】:

  • 您有用于测试的示例用户输入吗?

标签: python url relative-path


【解决方案1】:

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 开头的网址。这实际上是有道理的,因为没有严格的规则:网站可以使用 www 作为子资源...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多