1

我正在尝试运行我在网上找到的刮板,但收到 ValueError: too many values to unpack on this line code

 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())

如果您有任何意见,将不胜感激,谢谢。

4

3 回答 3

2

您可以使用urlparse.parse_qs函数,而不是自己解析 url:

>>> 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']}

来源

于 2017-07-13T22:02:58.000 回答
1

这是因为其中一个pieces 包含两个或多个'='字符。在这种情况下,您将返回一个包含三个或更多元素的列表。而且您不能将其分配给这两个值。

您可以通过在调用中添加一个附加参数来最多'='拆分一个来解决该问题.split(..)

k, v = piece.split("=",1)

但是现在我们仍然不能保证字符串'='中有一个。piece

但是,我们可以在urllib.parse中使用该模块(在中):urlparse

from urllib.parse import urlparse, parse_qsl

purl = urlparse(url)
quer = parse_qsl(purl.query)

for k,v in quer:
    # ...
    pass

现在我们已经将查询字符串解码为可以单独处理的键值元组列表。我建议也用 建立一个 URL urllib

于 2017-07-13T22:06:47.183 回答
0

您还没有显示任何基本调试:piece问题点是什么?=如果它在字符串中有多个,则该split操作将返回超过 2 个值 - 因此您的错误消息。

如果您只想在第一个 =上拆分,则使用index获取位置,并获取您需要的切片:

pos = piece.index('=')
k = piece[:pos]
v = piece[pos+1:]
于 2017-07-13T21:55:22.367 回答