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

Bre*_*dan 16 python python-3.x

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

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

我想:http: //127.0.0.1/asdf/

dal*_*ler 20

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

来自文档:

该模块旨在匹配相对统一资源定位器上的Internet RFC.它支持下列URL方案: file,ftp,gopher,hdl,http,https,imap,mailto,mms,news,nntp, prospero,rsync,rtsp,rtspu,sftp,shttp,sip,sips,snews,svn, svn+ssh,telnet,wais,ws,wss.

你想用urlspliturlunsplit做这样的事情:

from urllib.parse import urlsplit, urlunsplit

split_url = urlsplit('http://127.0.0.1/asdf/login.php?q=abc#stackoverflow')

# You now have:
# split_url.scheme   "http"
# split_url.netloc   "127.0.0.1" 
# split_url.path     "/asdf/login.php"
# split_url.query    "q=abc"
# split_url.fragment "stackoverflow"

# Use all the path except everything after the last '/' 
clean_path = "".join(split_url.path.rpartition("/")[:-1])

# "/asdf/"

# urlunsplit joins a urlsplit tuple
clean_url = urlunsplit(split_url)

# "http://127.0.0.1/asdf/login.php?q=abc#stackoverflow"


# A more advanced example 
advanced_split_url = urlsplit('http://foo:bar@127.0.0.1:5000/asdf/login.php?q=abc#stackoverflow')

# You now have *in addition* to the above:
# advanced_split_url.username   "foo"
# advanced_split_url.password   "bar"
# advanced_split_url.hostname   "127.0.0.1"
# advanced_split_url.port       "5000"
Run Code Online (Sandbox Code Playgroud)

  • 您的split and rejoin可能应该使用''/'。join`,否则您将删除所有斜杠。另一种更聪明的方法可能是`“” .join(split_url.rpartition('/')[:-1]`,它仅执行一次拆分,如果不存在斜杠,则实际上成为noop。 (2认同)

Sha*_*ger 14

嗯,对于一个,你可以使用os.path.dirname:

>>> os.path.dirname('http://127.0.0.1/asdf/login.php')
'http://127.0.0.1/asdf'
Run Code Online (Sandbox Code Playgroud)

它并不是明确的URL,但它恰好在它们上工作(即使在Windows上),它只是没有留下斜杠(你可以自己添加它).

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

最后,如果你想在最后一个斜线之后刚刚分离出来的成分,你可以做一个rsplitmaxsplit1,并保持第一部分:

>>> 'http://127.0.0.1/asdf/login.php'.rsplit('/', 1)[0]
'http://127.0.0.1/asdf'
Run Code Online (Sandbox Code Playgroud)

  • @dalanmiller:因为他们使用相同的分隔符.即使在Windows上,正斜杠也是合法的路径分隔符(只是Windows优先使用反斜杠),因此路径操作API旨在处理各处的正斜杠,并且URL以相同的方式使用它们. (2认同)

rod*_*dms 9

同意最好的方法是urllib.parse

具体来说,您可以使用 分解 url urllib.parse.urlparse,然后将除 和 之外的所有属性替换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()
Run Code Online (Sandbox Code Playgroud)

例子:

>>> 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'
Run Code Online (Sandbox Code Playgroud)


小智 7

有使用 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/
Run Code Online (Sandbox Code Playgroud)

请记住,urllib 库支持与 HTML 关键字兼容的 uri/url。这意味着以 '/' 结尾的 uri/url 意味着不同,没有像这里/sf/answers/125529771/

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/
Run Code Online (Sandbox Code Playgroud)

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