浏览代码

[enh] json engine added

asciimoo 11 年前
父节点
当前提交
1cb489ba1a
共有 1 个文件被更改,包括 79 次插入0 次删除
  1. 79
    0
      searx/engines/json_engine.py

+ 79
- 0
searx/engines/json_engine.py 查看文件

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