json_engine.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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: return False
  18. if type(obj) == unicode: return False
  19. return isinstance(obj, Iterable)
  20. def parse(query):
  21. q = []
  22. for part in query.split('/'):
  23. if part == '':
  24. continue
  25. else:
  26. q.append(part)
  27. return q
  28. def do_query(data, q):
  29. ret = []
  30. if not len(q):
  31. return ret
  32. qkey = q[0]
  33. for key,value in iterate(data):
  34. if len(q) == 1:
  35. if key == qkey:
  36. ret.append(value)
  37. elif is_iterable(value):
  38. ret.extend(do_query(value, q))
  39. else:
  40. if not is_iterable(value):
  41. continue
  42. if key == qkey:
  43. ret.extend(do_query(value, q[1:]))
  44. else:
  45. ret.extend(do_query(value, q))
  46. return ret
  47. def query(data, query_string):
  48. q = parse(query_string)
  49. return do_query(data, q)
  50. def request(query, params):
  51. query = urlencode({'q': query})[2:]
  52. params['url'] = search_url.format(query=query)
  53. params['query'] = query
  54. return params
  55. def response(resp):
  56. results = []
  57. json = loads(resp.text)
  58. urls = query(json, url_query)
  59. contents = query(json, content_query)
  60. titles = query(json, title_query)
  61. for url, title, content in zip(urls, titles, contents):
  62. results.append({'url': url, 'title': title, 'content': content})
  63. return results