Python ValueError: too many values to unpack for crawler

Python ValueError: too many values to unpack for crawler

我正在尝试 运行 我在网上找到的一个抓取工具,但收到一个 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())

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

您没有显示任何基本调试:问题点 piece 是什么?如果字符串中有多个 =,则 split 操作将 return 超过 2 个值——因此出现错误消息。

如果你只想在第一个 =上分割,然后使用index获取位置,然后抓取你需要的切片:

pos = piece.index('=')
k = piece[:pos]
v = piece[pos+1:]

您可以使用 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']}

(source)

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

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

k, v = piece.split("="<b>,1</b>)

但现在我们仍然无法保证 piece 字符串中存在 '='

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

<b>from urllib.parse import urlparse, parse_qsl</b>

purl = <b>urlparse(</b>url<b>)</b>
quer = <b>parse_qsl(</b>purl.query<b>)</b>

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

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