如何在Python中获取URL的基础?

时间:2016-02-25 01:13:33

标签: python python-3.x

我试图确定网址的基础,或者除了页面和参数之外的所有内容。我尝试使用split,但是有没有比将它拆分成碎片更好的方法?有没有办法可以删除上一个' /'?

中的所有内容

鉴于此: http://127.0.0.1/asdf/login.php

我想: http://127.0.0.1/asdf/

8 个答案:

答案 0 :(得分:17)

执行此操作的最佳方法是使用urllib.parse

来自文档:

  

该模块旨在匹配Relative RFC上的Internet RFC   统一资源定位器。它支持以下URL方案:   fileftpgopherhdlhttphttpsimapmailto,{{ 1}},mmsnews,   nntpprosperorsyncrtsprtspusftpshttpsip,{{ 1}},sips,   snewssvnsvn+sshtelnetwais

您希望使用urlspliturlunsplit执行此类操作:

ws

答案 1 :(得分:10)

嗯,首先,你可以使用os.path.dirname

>>> os.path.dirname('http://127.0.0.1/asdf/login.php')
'http://127.0.0.1/asdf'

它没有明确指出网址,但它恰好在它们上工作(即使在Windows上),它也不会留下尾随斜杠(你可以自己添加它)。

您可能还想查看urllib.parse.urlparse以获得更细粒度的解析;如果URL包含查询字符串或哈希,则您需要将其解析为片段,修剪解析返回的path组件,然后重新组合,以便修剪路径而不会丢失查询和哈希信息。

最后,如果您想在最后一个斜杠之后拆分组件,可以使用maxsplit 1执行rsplit,并保留第一个组件:

>>> 'http://127.0.0.1/asdf/login.php'.rsplit('/', 1)[0]
'http://127.0.0.1/asdf'

答案 2 :(得分:1)

获得最正确的斜线;使用字符串切片在原始字符串中的位置。 +1 会在最后获得最终的斜杠。

link = "http://127.0.0.1/asdf/login.php"
link[:link.rfind('/')+1]

答案 3 :(得分:1)

无需使用正则表达式,您只需使用rsplit()

>>> url = 'http://127.0.0.1/asdf/login.php'
>>> url.rsplit('/', 1)[0]
'http://127.0.0.1/asdf'

答案 4 :(得分:0)

如果使用python3,则可以使用urlparse和urlunparse。

In :from urllib.parse import urlparse, urlunparse

In :url = "http://127.0.0.1/asdf/login.php"

In :result = urlparse(url)

In :new = list(result)

In :new[2] = new[2].replace("login.php", "")

In :urlunparse(new)
Out:'http://127.0.0.1/asdf/'

答案 5 :(得分:0)

使用urllib库(最快速的方法)是针对Python3的最短解决方案:

from urllib.parse import urljoin

base_url = urljoin('http://127.0.0.1/asdf/login.php', '.')
# output: http://127.0.0.1/asdf/

请记住,urllib库支持与HTML关键字兼容的uri / url。这意味着以'/'结尾的uri / url意味着与此处https://stackoverflow.com/a/1793282/7750840/不同的是

base_url = urljoin('http://127.0.0.1/asdf/', '.')
# output: http://127.0.0.1/asdf/

base_url = urljoin('http://127.0.0.1/asdf', '.')
# output: http://127.0.0.1/

这是python的urllib的链接:https://pythonprogramming.net/urllib-tutorial-python-3/

答案 6 :(得分:0)

使用urlsplit时,它将返回SplitResult对象:

from urllib.parse import urlsplit
split_url = urlsplit('http://127.0.0.1/asdf/login.php')
print(split_url)

>>> SplitResult(scheme='http' netloc='127.0.0.1' path='/asdf/login.php' query='' fragment='') 

您可以创建自己的SplitResult()对象,并将其通过urlunsplit传递。只要您知道所需的最后一个路径元素,此代码就应该适用于多个URL拆分,而不论其长度如何。

from urllib.parse import urlsplit, urlunsplit, SplitResult

# splitting url:
split_url = urlsplit('http://127.0.0.1/asdf/login.php')

# editing the variables you want to change (in this case, path):    
last_element = 'asdf'   # this can be any element in the path.
path_array = split_url.path.split('/')

# print(path_array)
# >>> ['', 'asdf', 'login.php']

path_array.remove('') 
ind = path_array.index(last_element) 
new_path = '/' + '/'.join(path_array[:ind+1]) + '/'

# making SplitResult() object with edited data:
new_url = SplitResult(scheme=split_url.scheme, netloc=split_url.netloc, path=new_path, query='', fragment='')

# unsplitting:
base_url = urlunsplit(new_url)

答案 7 :(得分:0)

同意最好的方法是使用urllib.parse

具体来说,您可以使用urllib.parse.urlparse分解url,然后用空字符串替换schemenetloc以外的所有属性。如果您想保留path属性(如您的问题所示),则可以执行额外的字符串解析步骤。下面的示例函数:

import urllib.parse
def base_url(url, with_path=False):
    parsed = urllib.parse.urlparse(url)
    path   = '/'.join(parsed.path.split('/')[:-1]) if with_path else ''
    parsed = parsed._replace(path=path)
    parsed = parsed._replace(params='')
    parsed = parsed._replace(query='')
    parsed = parsed._replace(fragment='')
    return parsed.geturl()

示例:

>>> base_url('http://127.0.0.1/asdf/login.php', with_path=True)
'http://127.0.0.1/asdf'
>>> base_url('http://127.0.0.1/asdf/login.php')
'http://127.0.0.1'