我正在尝试运行我在网上找到的一个刮刀但收到一个ValueError:在这行代码中解压的值太多了
k, v = piece.split("=")
此行是此功能的一部分
def format_url(url):
# make sure URLs aren't relative, and strip unnecssary query args
u = urlparse(url)
scheme = u.scheme or "https"
host = u.netloc or "www.amazon.com"
path = u.path
if not u.query:
query = ""
else:
query = "?"
for piece in u.query.split("&"):
k, v = piece.split("=")
if k in settings.allowed_params:
query += "{k}={v}&".format(**locals())
query = query[:-1]
return "{scheme}://{host}{path}{query}".format(**locals())
如果您有任何意见,我们将不胜感激,谢谢。
答案 0 :(得分:2)
您可以使用urlparse.parse_qs
函数:
>>> from urlparse import urlparse, parse_qs
>>> URL = 'https://someurl.com/with/query_string?i=main&mode=front&sid=12ab&enc=+Hello'
>>> parsed_url = urlparse(URL)
>>> parse_qs(parsed_url.query)
{'i': ['main'], 'enc': [' Hello '], 'mode': ['front'], 'sid': ['12ab']}
(source)
答案 1 :(得分:1)
这是因为其中一个piece
包含两个或更多'='
个字符。在这种情况下,您将返回三个或更多元素的列表。而且你不能将它分配给这两个值。
您可以通过在'='
电话中添加其他参数来分割最多一个.split(..)
来解决该问题:
k, v = piece.split("=",1)
但是现在我们仍然无法保证'='
字符串中存在piece
。
然而,我们可以使用python-3.x中的urllib.parse
模块(python-2.x中的urlparse
):
from urllib.parse import urlparse, parse_qsl
purl = urlparse(url)
quer = parse_qsl(purl.query)
for k,v in quer:
# ...
pass
现在我们已将查询字符串解码为我们可以单独处理的键值元组的列表。我建议使用urllib
建立一个URL。
答案 2 :(得分:0)
您还没有显示任何基本调试:问题点的piece
是什么?如果字符串中有多个=
,则split
操作将返回超过2个值 - 因此您的错误消息。
如果您只想拆分第一个 =
,请使用index
获取该位置,并获取所需的切片:
pos = piece.index('=')
k = piece[:pos]
v = piece[pos+1:]