on master help sign in
[enh] display number of results
2f7752bAdam Tauber
searx/engines/bing.py+6−4
@@ -54,6 +54,12 @@ def response(resp):
54
54
55 dom = html.fromstring(resp.text)
55 dom = html.fromstring(resp.text)
56
56
57+ try:
58+ results.append({'number_of_results': int(dom.xpath('//span[@class="sb_count"]/text()')[0]
59+ .split()[0].replace(',', ''))})
60+ except:
61+ pass
62+
57 # parse results
63 # parse results
58 for result in dom.xpath('//div[@class="sa_cc"]'):
64 for result in dom.xpath('//div[@class="sa_cc"]'):
59 link = result.xpath('.//h3/a')[0]
65 link = result.xpath('.//h3/a')[0]
@@ -66,10 +72,6 @@ def response(resp):
66 'title': title,
72 'title': title,
67 'content': content})
73 'content': content})
68
74
69− # return results if something is found
70− if results:
71− return results
72−
73 # parse results again if nothing is found yet
75 # parse results again if nothing is found yet
74 for result in dom.xpath('//li[@class="b_algo"]'):
76 for result in dom.xpath('//li[@class="b_algo"]'):
75 link = result.xpath('.//h2/a')[0]
77 link = result.xpath('.//h2/a')[0]
searx/engines/yahoo.py+7
@@ -77,6 +77,13 @@ def response(resp):
77
77
78 dom = html.fromstring(resp.text)
78 dom = html.fromstring(resp.text)
79
79
80+ try:
81+ results_num = int(dom.xpath('//div[@class="compPagination"]/span[last()]/text()')[0]
82+ .split()[0].replace(',', ''))
83+ results.append({'number_of_results': results_num})
84+ except:
85+ pass
86+
80 # parse results
87 # parse results
81 for result in dom.xpath(results_xpath):
88 for result in dom.xpath(results_xpath):
82 try:
89 try:
searx/results.py+4
@@ -99,6 +99,7 @@ class ResultContainer(object):
99 self._infobox_ids = {}
99 self._infobox_ids = {}
100 self.suggestions = set()
100 self.suggestions = set()
101 self.answers = set()
101 self.answers = set()
102+ self.number_of_results = 0
102
103
103 def extend(self, engine_name, results):
104 def extend(self, engine_name, results):
104 for result in list(results):
105 for result in list(results):
@@ -111,6 +112,9 @@ class ResultContainer(object):
111 elif 'infobox' in result:
112 elif 'infobox' in result:
112 self._merge_infobox(result)
113 self._merge_infobox(result)
113 results.remove(result)
114 results.remove(result)
115+ elif 'number_of_results' in result:
116+ self.number_of_results = max(self.number_of_results, result['number_of_results'])
117+ results.remove(result)
114
118
115 with RLock():
119 with RLock():
116 engines[engine_name].stats['search_count'] += 1
120 engines[engine_name].stats['search_count'] += 1
searx/templates/oscar/results.html+10
@@ -78,6 +78,16 @@
78 </div><!-- /#main_results -->
78 </div><!-- /#main_results -->
79
79
80 <div class="col-sm-4" id="sidebar_results">
80 <div class="col-sm-4" id="sidebar_results">
81+ {% if number_of_results %}
82+ <div class="panel panel-default">
83+ <div class="panel-heading">
84+ <h4 class="panel-title">{{ _('Number of results') }}</h4>
85+ </div>
86+ <div class="panel-body">
87+ {{ number_of_results }}
88+ </div>
89+ </div>
90+ {% endif %}
81 {% if infoboxes %}
91 {% if infoboxes %}
82 {% for infobox in infoboxes %}
92 {% for infobox in infoboxes %}
83 {% include 'oscar/infobox.html' %}
93 {% include 'oscar/infobox.html' %}
searx/webapp.py+4−2
@@ -48,7 +48,7 @@ from flask import (
48 Flask, request, render_template, url_for, Response, make_response,
48 Flask, request, render_template, url_for, Response, make_response,
49 redirect, send_from_directory
49 redirect, send_from_directory
50)
50)
51−from flask.ext.babel import Babel, gettext, format_date
51+from flask.ext.babel import Babel, gettext, format_date, format_decimal
52from flask.json import jsonify
52from flask.json import jsonify
53from searx import settings, searx_dir
53from searx import settings, searx_dir
54from searx.engines import (
54from searx.engines import (
@@ -420,6 +420,7 @@ def index():
420
420
421 if search.request_data.get('format') == 'json':
421 if search.request_data.get('format') == 'json':
422 return Response(json.dumps({'query': search.query,
422 return Response(json.dumps({'query': search.query,
423+ 'number_of_results': search.result_container.number_of_results,
423 'results': search.result_container.get_ordered_results()}),
424 'results': search.result_container.get_ordered_results()}),
424 mimetype='application/json')
425 mimetype='application/json')
425 elif search.request_data.get('format') == 'csv':
426 elif search.request_data.get('format') == 'csv':
@@ -439,7 +440,7 @@ def index():
439 'opensearch_response_rss.xml',
440 'opensearch_response_rss.xml',
440 results=search.result_container.get_ordered_results(),
441 results=search.result_container.get_ordered_results(),
441 q=search.request_data['q'],
442 q=search.request_data['q'],
442− number_of_results=search.result_container.results_length(),
443+ number_of_results=search.result_container.number_of_results,
443 base_url=get_base_url()
444 base_url=get_base_url()
444 )
445 )
445 return Response(response_rss, mimetype='text/xml')
446 return Response(response_rss, mimetype='text/xml')
@@ -450,6 +451,7 @@ def index():
450 q=search.request_data['q'],
451 q=search.request_data['q'],
451 selected_categories=search.categories,
452 selected_categories=search.categories,
452 paging=search.paging,
453 paging=search.paging,
454+ number_of_results=format_decimal(search.result_container.number_of_results),
453 pageno=search.pageno,
455 pageno=search.pageno,
454 base_url=get_base_url(),
456 base_url=get_base_url(),
455 suggestions=search.result_container.suggestions,
457 suggestions=search.result_container.suggestions,