Facebook Python“ValueError:太多值解包”

时间:2014-01-02 22:59:15

标签: python facebook python-2.7

我是编程和Python的新手..

以下是我的代码。

import csv
import json
import urllib
import sys
import time
import re

class FacebookSearch:
    def __init__(self,
        query   = 'https://graph.facebook.com/search.{mode}?{query}&{access_token}'
    ):
        access_token = 'XXXXXX|XXXXX'

    def search(self, q, mode='json', **queryargs):
        queryargs['q'] = q
        query = urllib.urlencode(queryargs)
        return query


def write_csv(fname, rows, header=None, append=False, **kwargs):
    filemode = 'ab' if append else 'wb'
    with open(fname, filemode) as outf:
        out_csv = csv.writer(outf, **kwargs)
        if header:
            out_csv.writerow(header)
        out_csv.writerows(rows)

def main():
    ts = FacebookSearch()
    response, data = ts.search('appliance', type='post')  ## here is where I am getting the error.
    js = json.loads(data)



    messages = ([msg['created_time'],  msg['id']] for msg in js.get('data', []))

    write_csv('fb_washerdryer.csv', messages, append=True)

if __name__ == '__main__':
    main()

以下是关于错误的追溯:

追踪(最近一次通话):   文件“./facebook_washer_dryer1.sh”,第43行,in     主要()   在主要文件中输入“./facebook_washer_dryer1.sh”,第33行     响应,data = ts.search('appliance',type ='post') ValueError:要解压缩的值太多

1 个答案:

答案 0 :(得分:3)

您的FacebookSearch.search方法返回一个值,一个查询字符串以固定到URL。

但是当你调用它时,你试图将结果解包为两个变量:

response, data = ts.search('appliance', type='post')

这不起作用。

那么,为什么错误会说“太多的值”而不是“太少”?好吧,字符串实际上是一系列单字符字符串,因此它试图将该单个字符串解压缩为几十个单独的值,每个字符对应一个字符串。


然而,你在这里遇到了更大的问题。你明确期望你的search方法返回一个响应和一些数据,但它不返回任何东西,甚至远程,如响应和一些数据,它返回查询字符串。我想您想要使用查询字符串实际构建一个URL ,然后下载该URL,然后返回该下载的结果。

除非您编写实际尝试执行该操作的代码(这可能意味着将__init__更改为存储self.queryself.access_token,并使用self.query.format中的search,在结果字符串上使用urllib2.urlopen,以及其他一些更改),其余代码不会做任何有用的事情。

如果你现在要“删除”FacebookSearch,那么你可以测试其余的代码,你需要让它返回其他代码可以使用的适当的假数据。例如,您可以这样做:

def search(self, q, mode='json', **queryargs):
    queryargs['q'] = q
    query = urllib.urlencode(queryargs)
    # TODO: do the actual query
    return 200, '{"Fake": "data"}'