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

时间:2011-12-23 23:46:27

标签: 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())"})

虽然我已经在Learning Python the Hard Way采取了Zed的优秀课程,但我仍然是绿色的并且在这些方面需要帮助:

  1. 我喜欢只请求符合某些类别的网页,例如"本地商家"但是因为'类别'是一个列表(它没有在FB表中编入索引),我很难搞清楚它;我认为这是不可能的。

  2. 所以我找回了一个人喜欢的所有页面的全部信息,然后我需要将其整理出来。这就是我遇到的问题:

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

    目前我只是在HTML中渲染fbtest的输出;

    self.render("test.html", fbtest=fbtest)
    

    非常难看:

      

    fbtest:{U'数据&#39 ;: [{U' PAGE_ID&#39 ;: 8495417058L中,u'名称&#39 ;: U'马特·索&#39 ;,   你的类别':[],你的位置':{你'街道':你'',你' zip':你& #39;'}},   {u' page_id':9980651805L,u' name&#39 ;: u' deadmau5',u' category':[],   你的位置':{u' street':你'' zip':你'}},{u& #39; page_id':6209079710L,   你的名字':你的超级记录',你的类别':[],你的位置':{u' street':   U'&#39 ;, U'拉链&#39 ;: U''}},{U' PAGE_ID&#39 ;: 12609724042L中,u'名称&#39 ;: U' Oceanlab&#39 ;,   你的类别':[],你的位置':{你'街道':你'',你' zip':你& #39;'}}等等

    一旦我尝试操作列表,我就可以发送一个结果(比如匹配名称的页面="社会商业")但不是我要找的一系列结果。我的愿景是拥有一个很好的图画书缩略图视图,按页面分类和排序。

    谢谢,节日快乐,

    -James

1 个答案:

答案 0 :(得分:1)

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

import json
resp = json.loads(fql_resp)
data = resp['data']

loads代表加载字符串,这是您将从服务中获取的内容。从这里你有几个选择。如果你事先知道你想要什么类别,一种选择是使用内置filter。例如,以下数据集

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