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

4 投票
1 回答
897 浏览
提问于 2025-04-17 08:56

我是个老听众,第一次发言..

我从我的 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 的《学习 Python 的艰难之路》课程,但我还是有点菜,需要在以下几个方面得到帮助:

  1. 我希望只请求符合特定类别的页面,比如“本地商家”,但因为‘类别’是一个列表(而且在 Facebook 的表格中没有索引),我很难搞明白;我在想这可能是不可能的。

  2. 所以我获取了一个人喜欢的所有页面的完整列表,然后需要在之后进行整理。以下是我遇到的麻烦:

我该如何处理这些结果(按类别和/或位置过滤,这两者都是列表),并将它们以可读的格式发送到我的 fbtest.html 文件中?

目前我只是将 fbtest 的输出渲染成 HTML;

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

1 个回答

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

撰写回答