在 URL 上使用 split('/') 时测试第 [n] 个元素,而不会给出 "list index out of range" 错误

Testing for an [n]th element when using split('/') on a URL, without it giving a "list index out of range" error

Python 3.10.2

我有一个 URL,通常如下所示,略有不同(http/https,有时使用 www. 前缀,末尾的 #params 表示诸如推荐人或正在显示的设备之类的东西等)。

https://madeupdomain.net/u/Hypothetical_Username/Some-Random-Page-Name

我通常遇到的 URL 的形式是:

https://madeupdomain.net/u/Hypothetical_Username/

https://madeupdomain.net/u/Hypothetical_Username/Some-Random-Page-Name

我有兴趣用 URL 做什么:

  1. 获取 Hypothetical_Username 部分
  2. 查看 URL 是否停在用户名处,或者是否还有另一个 /path

我一直在使用 user = url.split('/')[4] 获取 URL 的用户名部分。由于 URL 总是包含用户名并且 URL 通常是一致的(目前),我可以依靠这个拆分来获得我想要的元素。如果 URL 将来有一点变化,我知道这会让我很痛苦。

但是,路径的其余部分是可选的。

如果我只使用 url.split('/')[5],python 会在遇到 URL 时立即抛出错误,其中 split 没有第 [5] 个元素。

所以我厌倦了用 if 语句“测试”它,它仍然抱怨并抛出错误 IndexError: list index out of range

if url.split('/')[5]:
    continue

当我打印出列表时,它看起来像以下任一内容。可以看到,第一个有5个元素,第二个有六个。

['https:', '', 'madeupdomain.net', 'u', 'Hypothetical_Username']

['https:', '', 'madeupdomain.net', 'u', 'Hypothetical_Username', 'Some-Random-Page-Name']

因此,我在每次迭代中都尝试了 运行 len(url.split('/')),以查看每个列表有多少个元素,它总是显示 6 - 无论是上面的第一个还是第二个示例。

所以,我有点不知所措,不知道有一种非常简单干净的方法来做我想做的事情。我知道有 url 解析库,但这对我想做的事情来说似乎有点过分了(获取用户名,然后找出是否有除此之外的路径名并决定如何处理 URL 一旦我知道)。

非常感谢这里的任何指导。我知道我只是在抨击一些非常简单的事情。

感谢您的意见。

解决方案 @Desktop-Firework 和@Kaushal-Sharma 的解决方案都以不同的方式运行良好。我还想添加最简单的方法来完成我最初尝试做的事情,一旦我根据他们的回答开始工作。对于 Python 经验水平以上的任何人来说,这都是显而易见的,但也许它会帮助处于我这种情况的人。

我只是在做一个“if”来检查索引点是否存在,而我显然应该使用 try-except。

所以,使用我的原始代码,我可以通过简单地更改来解决我需要的问题:

if url.split('/')[5]:
    continue

进入

isPath =  1
try: link.split("/")[5]
except IndexError: isPath = 0

只是添加这个,因为它直接回答了我在最基本的元素上试图做的事情。显然,它不像其他贡献者提供的解决方案那样健壮或优雅。

您可以将 url 拆分为 '/u/',然后将最后一部分拆分为 '/' 以获得用户名和之后的路径。

# case 1:
url = 'https://madeupdomain.net/u/Hypothetical_Username/Some-Random-Page-Name'

split_url = url.split('/u/')[-1].split('/')
hyp_username_part = split_url[0]
another_path_part = split_url[-1] if len(split_url) == 2 else None


print('username part: ', hyp_username_part, 'path part: ', another_path_part)


# case 2:
url = 'https://madeupdomain.net/u/Hypothetical_Username'

split_url = url.split('/u/')[-1].split('/')
hyp_username_part = split_url[0]
another_path_part = split_url[-1] if len(split_url) == 2 else None


print('username part: ', hyp_username_part, 'path part: ', another_path_part)

输出:

username part:  Hypothetical_Username path part:  Some-Random-Page-Name
username part:  Hypothetical_Username path part:  None

我建议获取 /u/ 的索引,然后将 /u/ 之后和 / 之前的每个字符作为用户名的一部分,然后尝试获取用户名后 / 后的字符。如果有IndexError,则用户名后面没有路径;如果没有,那就有一条路。

所以我提出这样的建议:

def getUserName(url):
   userStart = url.index('/u/') + 3
   urlIdx = userStart
   userName = ''
   while url[urlIdx] != '/':
      userName += url[urlIdx]
      urlIdx += 1
   urlIdx += 1
   isPath = 1
   try: url[urlIdx]
   except IndexError: isPath = 0
   return (userName, isPath)

它returns一个元组,第一个元素是用户名,第二个元素是用户名后是否有路径。但在 https://www.example.net/u/username/ 的情况下,它仅在用户名后有 / 时才有效。