如何从网址中删除查询字符串?

时间:2018-06-29 02:43:43

标签: python python-3.x url python-2.x

我有以下网址:

https://stackoverflow.com/questions/7990301?aaa=aaa
https://stackoverflow.com/questions/7990300?fr=aladdin
https://stackoverflow.com/questions/22375#6
https://stackoverflow.com/questions/22375?
https://stackoverflow.com/questions/22375#3_1

例如,我需要URL:

https://stackoverflow.com/questions/7990301
https://stackoverflow.com/questions/7990300
https://stackoverflow.com/questions/22375
https://stackoverflow.com/questions/22375
https://stackoverflow.com/questions/22375

我的尝试

url='https://stackoverflow.com/questions/7990301?aaa=aaa'
if '?' in url:
    url=url.split('?')[0]
if '#' in url:
    url = url.split('#')[0]

我认为这是一种愚蠢的方式

6 个答案:

答案 0 :(得分:10)

非常有用的库furl使得删除查询和片段部分变得很简单:

>>> furl.furl("https://hi.com/?abc=def#ghi").remove(args=True, fragment=True).url
https://hi.com/

答案 1 :(得分:4)

您可以拆分字符串中不存在的内容,只获取一个元素的列表,因此根据您的目标,可以执行以下操作来简化现有代码:

url = url.split('?')[0].split('#')[0]

并不是说这是最好的方法(URL是一个很好的解决方案),但这是一种方法。

答案 2 :(得分:1)

您可以尝试

urls = ["https://stackoverflow.com/questions/7990301?aaa=aaa",
"https://stackoverflow.com/questions/7990300?fr=aladdin",
"https://stackoverflow.com/questions/22375#6",
"https://stackoverflow.com/questions/22375"?,
"https://stackoverflow.com/questions/22375#3_1"]

urls_without_query = [url.split('?')[0] for url in urls]

例如,"https://stackoverflow.com/questions/7990301?aaa=aaa".split()返回一个类似于["https://stackoverflow.com/questions/7990301", "aaa=aaa"]的列表,如果该字符串为url,则url.split('?')[0]会给您"https://stackoverflow.com/questions/7990301"

编辑:我没有想到#的论点。其他答案可能会帮助您更多:)

答案 3 :(得分:1)

在您的示例中,您还将删除the fragmentthe thing after a #)。

您可以使用the query删除两者,然后在返回的namedtuple上调用urllib.parse.urlsplit并使用._replace转换回字符串URL:

from urllib.parse import urlsplit, urlunsplit

def remove_query_params_and_fragment(url):
    return urlunsplit(urlsplit(url)._replace(query="", fragment=""))

输出:

>>> remove_query_params_and_fragment("https://stackoverflow.com/questions/7990301?aaa=aaa")
'https://stackoverflow.com/questions/7990301'
>>> remove_query_params_and_fragment("https://stackoverflow.com/questions/7990300?fr=aladdin")
'https://stackoverflow.com/questions/7990300'
>>> remove_query_params_and_fragment("https://stackoverflow.com/questions/22375#6")
'https://stackoverflow.com/questions/22375'
>>> remove_query_params_and_fragment("https://stackoverflow.com/questions/22375?")
'https://stackoverflow.com/questions/22375'
>>> remove_query_params_and_fragment("https://stackoverflow.com/questions/22375#3_1")
'https://stackoverflow.com/questions/22375'

答案 4 :(得分:0)

您可以使用w3lib

from w3lib import url as w3_url
url_without_query = w3_url.url_query_cleaner(url)

答案 5 :(得分:0)

以下是使用标准库的答案,它可以正确解析URL:

from urllib.parse import urlparse

url = 'http://www.example.com/this/category?one=two'
parsed = urlparse(url)
print("".join([parsed.scheme,"://",parsed.netloc,parsed.path]))

预期输出:

http://www.example.com/this/category

注意:这还会剥离参数和片段,但是如果需要,可以很容易地对其进行修改以包含这些参数。