2017-07-13 2 views
1

Ich versuche, einen Schaber fand ich online zu laufen, aber ein Valueerror erhalten: zu viele Werte auf dieser Zeile Code entpackenPython Valueerror: zu viele Werte für Crawler entpacken

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

Diese Linie ist Teil von Diese Funktion

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

Wenn Sie irgendwelche Eingabe haben, wäre es dankbar, danke.

+2

Der Fehler besagt, dass nach der Aufteilung mehr als 2 Werte vorhanden sind, so dass sie in 2 Variablen nicht berücksichtigt werden können. Es gibt mehr als ein = in Ihrer Anfrage –

+0

Fügen Sie einfach ein 'Druckstück' vor diesem Aufruf hinzu und es wird das betreffende Stück ausgedruckt. Ohne zu wissen, welche URL Sie analysieren möchten, können wir keine spezifische Hilfe anbieten. – TemporalWolf

+1

Fügen Sie die Abfrage hier in Ihre Frage ein, wenn Sie Hilfe benötigen. –

Antwort

1

Dies ist aufgrund der Tatsache, dass einer der piece s enthält zwei oder mehr '=' Zeichen. In diesem Fall geben Sie also eine Liste von drei oder mehr Elementen zurück. Und Sie können es nicht den zwei Werten zuweisen.

können Sie dieses Problem lösen, indem höchstens ein '=' Aufspaltung durch einen zusätzlichen Parameter zum .split(..) Gespräch hinzugefügt:

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

Aber jetzt noch haben wir garantiert nicht, dass es eine '=' in der piece Zeichenfolge sowieso.

Wir können jedoch das urllib.parse Modul in (urlparse in ) verwenden:

from urllib.parse import urlparse, parse_qsl 

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

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

Jetzt haben wir die Query-String als eine Liste von Schlüsselwert Tupeln decodiert wir getrennt verarbeiten kann. Ich würde empfehlen, eine URL mit dem urllib auch zu bauen.

0

Sie haben kein grundlegendes Debugging gezeigt: Was ist piece am Problempunkt? Wenn es mehr als eine einzige = in der Zeichenfolge enthält, wird die split Operation mehr als 2 Werte zurückgeben - daher Ihre Fehlermeldung.

Wenn Sie auf aufzuspalten nur die erste=, dann index verwenden, um die Lage zu bekommen, und die Scheiben greifen Sie brauchen:

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

Kürzer und besser lesbar als '.index' wäre' .split ('=', maxsplit = 1) '. –

+0

'maxsplit' ist nicht in älteren Python-Versionen, aber guter Punkt. – Prune

2

Statt die URLs selbst zu parsen, können Sie urlparse.parse_qs verwenden Funktion:

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

Verwandte Themen