Как разобрать ответ FQL на страницах Facebook по категориям и / или местоположению?(Python) - PullRequest
4 голосов
/ 24 декабря 2011

Долгое время слушатель, впервые звонящий ..

Я получаю хороший результат от моего запроса API Open Graph в Facebook:

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

И хотя я прошел отличный курс Зеда по Изучение Python трудным путем , я все еще зелен и нуждаюсь в помощи по этим направлениям:

  1. Я хотел бы запросить ТОЛЬКО страницы, которые соответствуют определенным категориям, таким как «Местная компания», но поскольку «категории» - это список (и он не проиндексирован в таблице FB), у меня сложная задача время выяснить это; Я предполагаю, что это невозможно.

  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 ''}} и т. д.

И как только я пытаюсь манипулировать списком, я могу отправить один результат (например, соответствие страницы name = "thesocialbusiness"), но не серию результатов, которые я ищу. Мое видение состоит в том, чтобы иметь хороший просмотр миниатюрных страниц с картинками, которые классифицированы и отсортированы по местоположению.

Спасибо и счастливых праздников,

-Джеймс

1 Ответ

1 голос
/ 24 декабря 2011

Если я правильно понимаю, вы просто хотите отфильтровать конечный результат здесь?Если вы этого еще не сделали, преобразуйте строку json в объект python

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

loads означает load string , что вы и получите.из службы.Отсюда у вас есть несколько вариантов.Одним из вариантов является использование встроенного 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...