如何正确操作 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 作为子资源...
我最近在做网络爬虫。在那个项目中,当我的爬虫收集站点中的链接时,有些 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 作为子资源...