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
字符串中存在 '='
。
但是我们可以在 python-3.x (urlparse
in python-2.x 中使用 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。
我正在尝试 运行 我在网上找到的一个抓取工具,但收到一个 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
字符串中存在 '='
。
但是我们可以在 python-3.x (urlparse
in python-2.x 中使用 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。