如何按类别和/或位置解析Facebook页面的FQL响应?(Python)
我是个老听众,第一次发言..
我从我的 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 的艰难之路》课程,但我还是有点菜,需要在以下几个方面得到帮助:
我希望只请求符合特定类别的页面,比如“本地商家”,但因为‘类别’是一个列表(而且在 Facebook 的表格中没有索引),我很难搞明白;我在想这可能是不可能的。
所以我获取了一个人喜欢的所有页面的完整列表,然后需要在之后进行整理。以下是我遇到的麻烦:
我该如何处理这些结果(按类别和/或位置过滤,这两者都是列表),并将它们以可读的格式发送到我的 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 个回答
如果我理解得没错,你只是想对最终结果进行筛选,对吧?如果你还没有这样做,可以先把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
。