【问题标题】:Delete only a specific query from an URL仅从 URL 中删除特定查询
【发布时间】:2021-04-21 08:44:42
【问题描述】:

所以我有以下网址:https://foo.bar?query1=value1&query2=value2&query3=value3

例如,我需要一个可以仅剥离 query2 的函数,这样结果将是: https://foo.bar?query1=value1&query3=value3

我认为也许 urllib.parse 或 furl 可以以一种简单而干净的方式做到这一点?

【问题讨论】:

  • 是否尝试将其转换为字符串并使用 repalce?
  • @NirElbaz 你如何替换你不知道的东西?
  • 你知道&的个数,找到第一个然后第二个然后去掉
  • @NirElbaz 所以这不是替代品...而且,参数可以任意排序,恐怕仅数 & 是不够的。
  • @MarcoBonelli ,我不确定我是否理解,您要删除第二个查询还是要删除名为 query2 的字符串?

标签: python parsing url


【解决方案1】:

您应该使用urllib.parse,因为它专为这些目的而设计。我不清楚有人在这里重新发明轮子的原因。

基本上3步:

  1. 使用 urlparse 将 url 解析为它的组成部分
  2. 使用 parse_qs 解析查询字符串部分,保留空白(如果相关完整)
  3. 删除错误的查询2并将查询字符串和url重新编码

来自文档:

将 URL 解析为六个组件,返回一个名为 tuple 的 6 项。这 对应于 URL 的一般结构: 方案://netloc/path;parameters?query#fragment。每个元组项是一个 字符串,可能为空。

from urllib.parse import urlparse, urlencode, parse_qs, urlunparse
url = "https://foo.bar?query1=value1&query2=value2&query3=value3"
url_bits = list(urlparse(url))
print(url_bits)

query_string = parse_qs(url_bits[4], keep_blank_values=True)
print(query_string)

del(query_string['query2'])
url_bits[4] = urlencode(query_string, doseq=True)
new_url = urlunparse(url_bits)

print(new_url)

# >>>['https', 'foo.bar', '', '', 'query1=value1&query2=value2&query3=value3', '']
# >>>{'query1': ['value1'], 'query2': ['value2'], 'query3': ['value3']}
# >>>https://foo.bar?query1=value1&query3=value3

【讨论】:

  • 看来 OP 想要删除第二个查询,而不是名为 query2 的查询参数
  • 我认为这很模棱两可,但更有可能是应该删除 query2 而不是字符串中的第二个查询。 OP应该澄清。
  • 这项工作完美无缺,即使我曾希望有一个更短的解决方案。可能最好使用正则表达式去除由 ?/& 字符分隔的查询。
  • 我认为你最终会得到一个匹配列表,然后需要迭代,匹配到 query2 并在重新创建 url 之前删除。这就是图书馆已经在做的事情。我只是分解了这些步骤以便于遵循。
【解决方案2】:

如果你想按位置:

url="https://foo.bar?query1=value1&query2=value2&query3=value3"

findindex1=url.find("&")
findindex2=url.find("&",findindex1+1)
url=url[0:findindex1]+url[findindex2:len(url)]

如果你想要名字:

url="https://foo.bar?query1=value1&query3=value3&query2=value2"

findindex1=url.find("query2")
findindex2=url.find("&",findindex1+1)
if findindex2==-1:
    url=url[0:findindex1-1]
else:
    url=url[0:findindex1-1]+url[findindex2:len(url)]

【讨论】:

  • 我认为 OP 正在尝试删除具有特定名称而不是特定位置的查询参数。例如,考虑url="https://foo.bar?query1=value1&query3=value3&query2=value2",现在呢?
  • @MarcoBonelli 这只是一个微小的变化,我将编辑我的答案以适应两者
【解决方案3】:

你好,你可以试试正则表达式。

re.sub("ThePatternOfTheURL","ThePatternYouWantToHave", "TheInput")

所以它可能看起来像这样

pattern = "'(https\:\/\/)([a-zA-Z.?0-9=]+)([&]query2=value2)([&][a-zA-Z0-9=]+)'"

#filters the third group out with query2
filter = r"\1\2\4"
 
yourUrl = "https://foo.bar?query1=value1&query2=value2&query3=value3"

newURL=re.sub(pattern, filter, yourUrl)

我认为这应该适合你

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 2016-10-25
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多