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

Если у вас есть какой-либо вклад, мы будем признательны, спасибо.


person emmodz    schedule 13.07.2017    source источник
comment
Ошибка заключается в том, что после разделения имеется более 2 значений, поэтому он не может разместить его в 2 переменных. В вашем запросе более одного =   -  person Rajan Chauhan    schedule 14.07.2017
comment
Просто добавьте print piece перед этим вызовом, и он распечатает оскорбительный фрагмент. Не зная, какой URL вы пытаетесь проанализировать, мы не можем предложить конкретную помощь.   -  person TemporalWolf    schedule 14.07.2017
comment
Включите запрос здесь в свой вопрос, если вам нужна помощь.   -  person Rajan Chauhan    schedule 14.07.2017


Ответы (3)


Это связано с тем, что один из piece содержит два или более '=' символов. В этом случае вы таким образом возвращаете список из трех или более элементов. И вы не можете присвоить его двум значениям.

Вы можете решить эту проблему, разделив не более одного '=', добавив дополнительный параметр к вызову .split(..):

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

Но теперь у нас все еще нет гарантий, что в строке piece все равно есть '='.

Однако мы можем использовать модуль urllib.parse в python-3.x (urlparse в python-2.x):

from urllib.parse import urlparse, parse_qsl

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

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

Теперь мы расшифровали строку запроса как список кортежей ключ-значение, которые мы можем обрабатывать отдельно. Я бы посоветовал также создать URL-адрес с urllib.

person Willem Van Onsem    schedule 13.07.2017

Вместо того, чтобы самостоятельно анализировать URL-адреса, вы можете использовать функцию 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']}

(источник)

person Dennis Golomazov    schedule 13.07.2017

Вы не показали никакой базовой отладки: что такое piece в проблемной точке? Если в строке более одного =, операция split вернет более 2 значений - отсюда и ваше сообщение об ошибке.

Если вы хотите разделить только первый =, используйте index, чтобы получить местоположение, и возьмите нужные фрагменты:

pos = piece.index('=')
k = piece[:pos]
v = piece[pos+1:]
person Prune    schedule 13.07.2017
comment
Короче и читабельнее, чем .index, будет .split('=', maxsplit=1). - person Aran-Fey; 14.07.2017