我试图确定网址的基础,或者除了页面和参数之外的所有内容。我尝试使用split,但是有没有比将它拆分成碎片更好的方法?有没有办法可以删除上一个' /'?
中的所有内容答案 0 :(得分:17)
执行此操作的最佳方法是使用urllib.parse
。
来自文档:
该模块旨在匹配Relative RFC上的Internet RFC 统一资源定位器。它支持以下URL方案:
file
,ftp
,gopher
,hdl
,http
,https
,imap
,mailto
,{{ 1}},mms
,news
,nntp
,prospero
,rsync
,rtsp
,rtspu
,sftp
,shttp
,sip
,{{ 1}},sips
,snews
,svn
,svn+ssh
,telnet
,wais
。
您希望使用urlsplit和urlunsplit执行此类操作:
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,然后用空字符串替换scheme
和netloc
以外的所有属性。如果您想保留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'