json_engine.py 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from urllib import urlencode
  2. from json import loads
  3. from collections import Iterable
  4. search_url = None
  5. url_query = None
  6. content_query = None
  7. title_query = None
  8. #suggestion_xpath = ''
  9. def iterate(iterable):
  10. if type(iterable) == dict:
  11. it = iterable.iteritems()
  12. else:
  13. it = enumerate(iterable)
  14. for index, value in it:
  15. yield str(index), value
  16. def is_iterable(obj):
  17. if type(obj) == str:
  18. return False
  19. if type(obj) == unicode:
  20. return False
  21. return isinstance(obj, Iterable)
  22. def parse(query):
  23. q = []
  24. for part in query.split('/'):
  25. if part == '':
  26. continue
  27. else:
  28. q.append(part)
  29. return q
  30. def do_query(data, q):
  31. ret = []
  32. if not len(q):
  33. return ret
  34. qkey = q[0]
  35. for key, value in iterate(data):
  36. if len(q) == 1:
  37. if key == qkey:
  38. ret.append(value)
  39. elif is_iterable(value):
  40. ret.extend(do_query(value, q))
  41. else:
  42. if not is_iterable(value):
  43. continue
  44. if key == qkey:
  45. ret.extend(do_query(value, q[1:]))
  46. else:
  47. ret.extend(do_query(value, q))
  48. return ret
  49. def query(data, query_string):
  50. q = parse(query_string)
  51. return do_query(data, q)
  52. def request(query, params):
  53. query = urlencode({'q': query})[2:]
  54. params['url'] = search_url.format(query=query)
  55. params['query'] = query
  56. return params
  57. def response(resp):
  58. results = []
  59. json = loads(resp.text)
  60. urls = query(json, url_query)
  61. contents = query(json, content_query)
  62. titles = query(json, title_query)
  63. for url, title, content in zip(urls, titles, contents):
  64. results.append({'url': url, 'title': title, 'content': content})
  65. return results