我是编程和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:要解压缩的值太多
答案 0 :(得分:3)
您的FacebookSearch.search
方法返回一个值,一个查询字符串以固定到URL。
但是当你调用它时,你试图将结果解包为两个变量:
response, data = ts.search('appliance', type='post')
这不起作用。
那么,为什么错误会说“太多的值”而不是“太少”?好吧,字符串实际上是一系列单字符字符串,因此它试图将该单个字符串解压缩为几十个单独的值,每个字符对应一个字符串。
然而,你在这里遇到了更大的问题。你明确期望你的search
方法返回一个响应和一些数据,但它不返回任何东西,甚至远程,如响应和一些数据,它返回查询字符串。我想您想要使用查询字符串实际构建一个URL ,然后下载该URL,然后返回该下载的结果。
除非您编写实际尝试执行该操作的代码(这可能意味着将__init__
更改为存储self.query
和self.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"}'