on master help sign in
Merge pull request #1368 from aliceinwire/gentoo_engine

Add Gentoo wiki search engine

commit052a71d05a159ccb08efb7c1bf0d42e75ecdd636 authorAdam Tauber <asciimoo@gmail.com> dateTue 21 Aug 2018, 16:24 (8 years ago) parent8ec5511d24c58c
2 files changed+132
searx/engines/gentoo.py+128 searx/settings.yml+4
searx/engines/gentoo.pynew file+128
@@ -0,0 +1,128 @@
1+# -*- coding: utf-8 -*-
2+
3+"""
4+ Gentoo Wiki
5+
6+ @website https://wiki.gentoo.org
7+ @provide-api yes
8+ @using-api no
9+ @results HTML
10+ @stable no (HTML can change)
11+ @parse url, title
12+"""
13+
14+from lxml import html
15+from searx.engines.xpath import extract_text
16+from searx.url_utils import urlencode, urljoin
17+
18+# engine dependent config
19+categories = ['it']
20+language_support = True
21+paging = True
22+base_url = 'https://wiki.gentoo.org'
23+
24+# xpath queries
25+xpath_results = '//ul[@class="mw-search-results"]/li'
26+xpath_link = './/div[@class="mw-search-result-heading"]/a'
27+
28+
29+# cut 'en' from 'en-US', 'de' from 'de-CH', and so on
30+def locale_to_lang_code(locale):
31+ if locale.find('-') >= 0:
32+ locale = locale.split('-')[0]
33+ return locale
34+
35+
36+# wikis for some languages were moved off from the main site, we need to make
37+# requests to correct URLs to be able to get results in those languages
38+lang_urls = {
39+ 'en': {
40+ 'base': 'https://wiki.gentoo.org',
41+ 'search': '/index.php?title=Special:Search&offset={offset}&{query}'
42+ },
43+ 'others': {
44+ 'base': 'https://wiki.gentoo.org',
45+ 'search': '/index.php?title=Special:Search&offset={offset}&{query}\
46+ &profile=translation&languagefilter={language}'
47+ }
48+}
49+
50+
51+# get base & search URLs for selected language
52+def get_lang_urls(language):
53+ if language != 'en':
54+ return lang_urls['others']
55+ return lang_urls['en']
56+
57+
58+# Language names to build search requests for
59+# those languages which are hosted on the main site.
60+main_langs = {
61+ 'ar': 'العربية',
62+ 'bg': 'Български',
63+ 'cs': 'Česky',
64+ 'da': 'Dansk',
65+ 'el': 'Ελληνικά',
66+ 'es': 'Español',
67+ 'he': 'עברית',
68+ 'hr': 'Hrvatski',
69+ 'hu': 'Magyar',
70+ 'it': 'Italiano',
71+ 'ko': '한국어',
72+ 'lt': 'Lietuviškai',
73+ 'nl': 'Nederlands',
74+ 'pl': 'Polski',
75+ 'pt': 'Português',
76+ 'ru': 'Русский',
77+ 'sl': 'Slovenský',
78+ 'th': 'ไทย',
79+ 'uk': 'Українська',
80+ 'zh': '简体中文'
81+}
82+supported_languages = dict(lang_urls, **main_langs)
83+
84+
85+# do search-request
86+def request(query, params):
87+ # translate the locale (e.g. 'en-US') to language code ('en')
88+ language = locale_to_lang_code(params['language'])
89+
90+ # if our language is hosted on the main site, we need to add its name
91+ # to the query in order to narrow the results to that language
92+ if language in main_langs:
93+ query += b' (' + (main_langs[language]).encode('utf-8') + b')'
94+
95+ # prepare the request parameters
96+ query = urlencode({'search': query})
97+ offset = (params['pageno'] - 1) * 20
98+
99+ # get request URLs for our language of choice
100+ urls = get_lang_urls(language)
101+ search_url = urls['base'] + urls['search']
102+
103+ params['url'] = search_url.format(query=query, offset=offset,
104+ language=language)
105+
106+ return params
107+
108+
109+# get response from search-request
110+def response(resp):
111+ # get the base URL for the language in which request was made
112+ language = locale_to_lang_code(resp.search_params['language'])
113+ base_url = get_lang_urls(language)['base']
114+
115+ results = []
116+
117+ dom = html.fromstring(resp.text)
118+
119+ # parse results
120+ for result in dom.xpath(xpath_results):
121+ link = result.xpath(xpath_link)[0]
122+ href = urljoin(base_url, link.attrib.get('href'))
123+ title = extract_text(link)
124+
125+ results.append({'url': href,
126+ 'title': title})
127+
128+ return results
searx/settings.yml+4
@@ -273,6 +273,10 @@ engines:
273273 timeout : 3.0
274274 disabled: True
275275
276+ - name : gentoo
277+ engine : gentoo
278+ shortcut : ge
279+
276280 - name : gitlab
277281 engine : json_engine
278282 paging : True