有没有其他方法可以替代parse_qs来处理分号?

2024-05-23 22:55:51 发布

您现在位置:Python中文网/ 问答频道 /正文

TL;DR

有哪些库/调用可以处理包含分号的查询字符串,而不是parse_qs?在

>>> urlparse.parse_qs("tagged=python;ruby")
>>> {'tagged': ['python']}

完整背景

我正在使用stackexchangeapi来搜索带标签的问题。在

Search的布局如下,标记之间用分号分隔:

^{}

与API交互很好。当我想测试调用时,特别是使用httpretty模拟HTTP时,问题就出现了。在

在幕后,httpretty正在使用python标准库中的urlparse.parse_qs来解析查询字符串。在

^{pr2}$

很明显这不太管用。这是一个小例子,下面是httpretty的一个片段(在测试上下文之外)。在

import requests
import httpretty

httpretty.enable()

httpretty.register_uri(httpretty.GET, "https://api.stackexchange.com/2.1/search", body='{"items":[]}')
resp = requests.get("https://api.stackexchange.com/2.1/search", params={"tagged":"python;ruby"})
httpretty_request = httpretty.last_request()
print(httpretty_request.querystring)

httpretty.disable()
httpretty.reset()

我想使用httpretty的机器,但是需要一个parse_qs的解决方法。我现在可以猴子补丁httpretty,但想看看还能做什么。在


Tags: 字符串httpsimportcomapisearchparserequest
1条回答
网友
1楼 · 发布于 2024-05-23 22:55:51

为了解决这个问题,我临时修补了httpretty.core.unquote_utf8(技术上是httpretty.compat.unquote_utf8)。在

#
# To get around how parse_qs works (urlparse, under the hood of
# httpretty), we'll leave the semi colon quoted.
# 
# See https://github.com/gabrielfalcao/HTTPretty/issues/134
orig_unquote = httpretty.core.unquote_utf8
httpretty.core.unquote_utf8 = (lambda x: x)

# It should handle tags as a list
httpretty.register_uri(httpretty.GET,
                       "https://api.stackexchange.com/2.1/search",
                       body=param_check_callback({'tagged': 'python;dog'}))
search_questions(since=since, tags=["python", "dog"], site="pets")

...

# Back to normal for the rest
httpretty.core.unquote_utf8 = orig_unquote
# Test the test by making sure this is back to normal
assert httpretty.core.unquote_utf8("%3B") == ";"

这假设您不需要任何未引用的内容。另一个选择是在分号到达parse_qs之前只保留分号百分比编码。在

相关问题 更多 >