在Python中解压缩ValueError

时间:2014-02-27 12:02:48

标签: python

我正在使用Python制作网站组件扫描程序。不幸的是,当我在脚本中添加另一个值时出现了问题。这是我的剧本:

#!/usr/bin/python


import sys
import urllib2
import re
import time
import httplib
import random

# Color Console
W  = '\033[0m'  # white (default)
R  = '\033[31m' # red
G  = '\033[1;32m' # green bold
O  = '\033[33m' # orange
B  = '\033[34m' # blue
P  = '\033[35m' # purple
C  = '\033[36m' # cyan
GR = '\033[37m' # gray

#Bad HTTP Responses 
BAD_RESP = [400,401,404]

def main(path):
print "[+] Testing:",host.split("/",1)[1]+path
try:
    h = httplib.HTTP(host.split("/",1)[0])
    h.putrequest("HEAD", "/"+host.split("/",1)[1]+path)
    h.putheader("Host", host.split("/",1)[0])
    h.endheaders()
    resp, reason, headers = h.getreply()
    return resp, reason, headers.get("Server")
except(), msg: 
    print "Error Occurred:",msg
    pass

def timer():
    now = time.localtime(time.time())
    return time.asctime(now)

def slowprint(s):
    for c in s + '\n':
        sys.stdout.write(c)
        sys.stdout.flush() # defeat buffering
        time.sleep(8./90)

print G+"\n\t                 Whats My Site Component Scanner"

coms = { "index.php?option=com_artforms" : "com_artforms" + "link1","index.php?option=com_fabrik" : "com_fabrik" + "ink"}

if len(sys.argv) != 2:
    print "\nUsage: python jx.py <site>"
    print "Example: python jx.py www.site.com/\n"
    sys.exit(1)

host = sys.argv[1].replace("http://","").rsplit("/",1)[0]
if host[-1] != "/":
    host = host+"/"

print "\n[+] Site:",host
print "[+] Loaded:",len(coms) 

print "\n[+] Scanning Components\n"
for com,nme,expl in coms.items():
    resp,reason,server = main(com)
    if resp not in BAD_RESP:
        print ""
        print G+"\t[+] Result:",resp, reason
        print G+"\t[+] Com:",nme
        print G+"\t[+] Link:",expl
        print W
    else:
        print ""
        print R+"\t[-] Result:",resp, reason
        print W
print "\n[-] Done\n"

这是出现的错误消息:

      Traceback (most recent call last):
        File "jscan.py", line 69, in <module>
        for com,nme,expl in xpls.items():
      ValueError: need more than 2 values to unpack

我已经尝试将2值更改为3或1,但它似乎不起作用。

4 个答案:

答案 0 :(得分:2)

xpls.items会返回两个项目的元组,您尝试将其解压缩为三个。你用两对key:value

自己初始化dict
coms = { "index.php?option=com_artforms" : "com_artforms" + "link1","index.php?option=com_fabrik" : "com_fabrik" + "ink"}

此外,回溯似乎来自另一个脚本 - dict在那里被称为xpls,并且在你发布的代码中被coms ...

答案 1 :(得分:1)

你可以尝试

for (xpl, poc) in xpls.items():
    ...
    ...

因为dict.items会返回带有2个值的元组。

答案 2 :(得分:0)

您拥有所需的所有信息。与任何错误一样,最好的起点是追溯。让我们来:

  for com,poc,expl in xpls.items():
ValueError: need more than 2 values to unpack

当给定对象的类型正确但值不正确时,Python会抛出ValueError。在这种情况下,这告诉我们xpls.itemsiterable,因此可以解压缩,但尝试失败。

异常描述缩小了问题:xpls有2个项目,但需要更多项目。通过查看引用行,我们可以看到“更多”是3。

简而言之:xpls应该有3个项目,但有2个。

请注意,我从未阅读其余代码。仅使用这两行就可以进行调试。

学习阅读追溯是至关重要的。当您再次遇到此错误时,请至少花10分钟尝试使用此信息。你的努力将会十倍地偿还。

答案 3 :(得分:0)

如前所述,dict.items()返回一个包含两个值的元组。如果您使用字符串列表作为字典值而不是字符串(之后应该拆分),您可以使用以下语法:

coms = { "index.php?option=com_artforms" : ["com_artforms", "link1"],
         "index.php?option=com_fabrik" : ["com_fabrik", "ink"]}

for com, (name, expl) in coms.items(): 
    print com, name, expl

>>> index.php?option=com_artforms com_artforms link1
>>> index.php?option=com_fabrik com_fabrik ink