From 1d30141c207e51c142cab3eee97783f08c1cb5c9 Mon Sep 17 00:00:00 2001 From: David A Roberts Date: Sat, 14 Jan 2017 18:40:37 +1000 Subject: [PATCH] [enh] show spelling corrections --- searx/engines/google.py | 4 ++++ searx/results.py | 4 ++++ searx/templates/oscar/results.html | 12 ++++++++++++ searx/webapp.py | 2 ++ tests/unit/test_webapp.py | 1 + 5 files changed, 23 insertions(+) diff --git a/searx/engines/google.py b/searx/engines/google.py index 2fa638d73..0fdf2d4ae 100644 --- a/searx/engines/google.py +++ b/searx/engines/google.py @@ -112,6 +112,7 @@ title_xpath = './/h3' content_xpath = './/span[@class="st"]' content_misc_xpath = './/div[@class="f slp"]' suggestion_xpath = '//p[@class="_Bmc"]' +spelling_suggestion_xpath = '//a[@class="spell"]' # map : detail location map_address_xpath = './/div[@class="s"]//table//td[2]/span/text()' @@ -275,6 +276,9 @@ def response(resp): # append suggestion results.append({'suggestion': extract_text(suggestion)}) + for correction in dom.xpath(spelling_suggestion_xpath): + results.append({'correction': extract_text(correction)}) + # return results return results diff --git a/searx/results.py b/searx/results.py index 6062f8013..e262ec110 100644 --- a/searx/results.py +++ b/searx/results.py @@ -127,6 +127,7 @@ class ResultContainer(object): self.infoboxes = [] self.suggestions = set() self.answers = set() + self.corrections = set() self._number_of_results = [] self._ordered = False self.paging = False @@ -140,6 +141,9 @@ class ResultContainer(object): elif 'answer' in result: self.answers.add(result['answer']) results.remove(result) + elif 'correction' in result: + self.corrections.add(result['correction']) + results.remove(result) elif 'infobox' in result: self._merge_infobox(result) results.remove(result) diff --git a/searx/templates/oscar/results.html b/searx/templates/oscar/results.html index f5e95438d..11c950b9e 100644 --- a/searx/templates/oscar/results.html +++ b/searx/templates/oscar/results.html @@ -16,6 +16,18 @@

{{ _('Search results') }}

{% include 'oscar/search.html' %} + {% if corrections %} +
+ {{ _('Try searching for:') }} + {% for correction in corrections %} + + {% endfor %} +
+ {% endif %} + {% if answers %} {% for answer in answers %}
diff --git a/searx/webapp.py b/searx/webapp.py index b2fca5313..0b7169310 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -479,6 +479,7 @@ def index(): 'number_of_results': number_of_results, 'results': results, 'answers': list(result_container.answers), + 'corrections': list(result_container.corrections), 'infoboxes': result_container.infoboxes, 'suggestions': list(result_container.suggestions)}), mimetype='application/json') @@ -515,6 +516,7 @@ def index(): advanced_search=advanced_search, suggestions=result_container.suggestions, answers=result_container.answers, + corrections=result_container.corrections, infoboxes=result_container.infoboxes, paging=result_container.paging, current_language=search_query.lang, diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py index 1ef1f56c3..ac5bf8c9d 100644 --- a/tests/unit/test_webapp.py +++ b/tests/unit/test_webapp.py @@ -36,6 +36,7 @@ class ViewsTestCase(SearxTestCase): def search_mock(search_self, *args): search_self.result_container = Mock(get_ordered_results=lambda: self.test_results, answers=set(), + corrections=set(), suggestions=set(), infoboxes=[], results=self.test_results,