Bre*_*dan 16 python python-3.x
我正在尝试确定URL的基础,或者除了页面和参数之外的所有内容.我尝试使用split,但是有没有比将它拆分成碎片更好的方法?有没有办法可以删除最后一个'/'的所有内容?
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.
你想用urlsplit和urlunsplit做这样的事情:
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)
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解析返回的组件,然后重新组合,以便修剪路径而不会丢失查询和哈希信息.
最后,如果你想在最后一个斜线之后刚刚分离出来的成分,你可以做一个rsplit用maxsplit的1,并保持第一部分:
>>> 'http://127.0.0.1/asdf/login.php'.rsplit('/', 1)[0]
'http://127.0.0.1/asdf'
Run Code Online (Sandbox Code Playgroud)
同意最好的方法是urllib.parse
具体来说,您可以使用 分解 url urllib.parse.urlparse,然后将除 和 之外的所有属性替换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()
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/
| 归档时间: |
|
| 查看次数: |
10619 次 |
| 最近记录: |