Python ValueError:要为crawler解压缩的值太多

时间:2017-07-13 21:49:18

标签: python web-scraping web-crawler valueerror

我正在尝试运行我在网上找到的一个刮刀但收到一个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())

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

3 个答案:

答案 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

然而,我们可以使用中的urllib.parse模块(中的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:]