我有以下网址:
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]
我认为这是一种愚蠢的方式
答案 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 fragment(the 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
注意:这还会剥离参数和片段,但是如果需要,可以很容易地对其进行修改以包含这些参数。