如何按类别和/或位置解析Facebook页面的FQL响应?(Python)

如何按类别和/或位置解析Facebook页面的FQL响应?(Python),python,facebook,facebook-fql,facebook-opengraph,Python,Facebook,Facebook Fql,Facebook Opengraph,长时间侦听器,第一次调用 我的Facebook Open Graph API查询得到了一个很好的结果: fbtest = graph.request("/fql", {"q": "SELECT name, page_id, categories, location FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid=me())"}) 虽然我参加了Zed的精彩课程,但我还是新手,需要在以下方面的帮助: 我希望只请

长时间侦听器,第一次调用

我的Facebook Open Graph API查询得到了一个很好的结果:

fbtest = graph.request("/fql", {"q": "SELECT name, page_id, categories, location 
FROM page WHERE page_id IN (SELECT page_id FROM page_fan WHERE uid=me())"})
虽然我参加了Zed的精彩课程,但我还是新手,需要在以下方面的帮助:

  • 我希望只请求与某些类别匹配的页面,例如“本地业务”,但因为“类别”是一个列表(并且在FB表中没有索引),我很难弄清楚它;我想这是不可能的

  • 因此,我检索了一个人喜欢的所有页面的全部内容,之后我需要对其进行整理。以下是我在做什么时遇到的问题:

  • 我如何操作结果(按类别和/或位置过滤,两者都是列表)并将其以可读格式发送到我的fbtest.html文件

    目前我正在用HTML呈现fbtest的输出

    self.render("test.html", fbtest=fbtest)
    
    这很难看:

    fbtest:{u'data':[{u'page_id':8495417058L,u'name':u'Mat Zo', u'categories':[],u'location':{u'street':u'',u'zip':u'}, {u'page_id':9980651805L,u'name':u'deadmau5',u'categories':[], u'location':{u'street':u',u'zip':u'},{u'page_id':6209079710L, u'name':u'Ultra Records'、u'categories':[]、u'location':{u'street': u'',u'zip':u'},{u'page_id':12609724042L,u'name':u'Oceanlab', u'categories':[]、u'location':{u'street':u'、u'zip':u'}等

    只要我尝试操作列表,我就可以发送一个结果(如页面匹配名称=“thesocialbusiness”),但不是我正在寻找的一系列结果。我的愿景是拥有一个漂亮的按位置分类和排序的页面图册缩略图视图

    谢谢,节日快乐


    -James

    如果我理解正确,您只是想在这里过滤最终结果?如果您还没有,请继续将json字符串转换为python对象

    import json
    resp = json.loads(fql_resp)
    data = resp['data']
    
    加载
    代表加载字符串,这是您将从服务中获得的内容。在这里,您有几个选项。如果您事先知道需要哪些类别,可以选择使用内置的
    过滤器
    。例如,以下数据集

    objs = [{'_id': 1, 'categories': ['a', 'b', 'c']},
            {'_id': 2, 'categories': ['b']},
            {'_id': 3, 'categories': ['c']}]
    
    您可以像这样筛选只包含
    b
    类别的结果

    def f(obj):
        return 'b' in obj['categories']
    
    filtered_objs = filter(f, objs)
    print(filtered_objs)
    # outputs:
    # [{'_id': 1, 'categories': ['a', 'b', 'c']},
    #  {'_id': 2, 'categories': ['b']}]
    
    如果您想要一个可重用的函数来过滤不同的类别,您可以执行以下操作

    def filter_objs(objs, category):
        result = []
        for obj in objs:
            if category in obj['categories']:
                result.append(category)
        return result
    
    filtered_objs = filter_objs(objs, 'b')
    
    最后,您可以使用列表理解,可以根据需要内联使用,也可以在filter_objs函数中使用

    filtered_objs = [obj for obj in objs if 'b' in obj['categories']]
    

    所以有很多方法可以过滤结果,但第一步是使用
    json.loads

    谢谢,我感谢你的帮助和不同的选项,特别是可重用函数。我想我会这样做。看起来初始加载函数有点怪怪的-我从json.loads中得到这个错误行:fbtest2=json.loads(fbtest)文件“C:\Python27\lib\json_init_uu.py”,第326行,在loads return\u default\u decoder.decode(s)文件“C:\Python27\lib\json\decoder.py”,第366行,在decode obj中,end=self.raw\u decode(s,idx=_w(s,0.end())类型错误:预期字符串或缓冲区如果打印类型(fbtest),会得到什么我还尝试了跳入过滤过程,得到了一个空的结果集。我想知道“categories”值是否有点复杂,因为当我查看fbtest数据时,这里有一个例子:u'name':u'the Blacksmith Restaurant',u'categories':[{u'id':0,u'name':u'Restaurant/Cafe'}]-所以也许我必须使用某种类型的“类别”:“名称”过滤器?感谢您的帮助@dskinnerook,因此它已经是一个python对象,您上面打印的fbtest是一个json对象,它转换为python dict,因此您的结果列表在fbtest['data'中],如果categories是一个对象列表,那么您将希望遍历它们并与所需的属性进行匹配,例如obj['categories']中c的
    :如果categories==c['name']:result.append(obj);break