.oO SearXNG Developer Documentation Oo.
Loading...
Searching...
No Matches
doku.py
Go to the documentation of this file.
1# SPDX-License-Identifier: AGPL-3.0-or-later
2"""
3 Doku Wiki
4"""
5
6from urllib.parse import urlencode
7from urllib.parse import urljoin
8from lxml.html import fromstring
9from searx.utils import extract_text, eval_xpath
10
11# about
12about = {
13 "website": 'https://www.dokuwiki.org/',
14 "wikidata_id": 'Q851864',
15 "official_api_documentation": 'https://www.dokuwiki.org/devel:xmlrpc',
16 "use_official_api": False,
17 "require_api_key": False,
18 "results": 'HTML',
19}
20
21# engine dependent config
22categories = ['general'] # 'images', 'music', 'videos', 'files'
23paging = False
24number_of_results = 5
25
26# search-url
27# Doku is OpenSearch compatible
28base_url = 'http://localhost:8090'
29search_url = (
30 # fmt: off
31 '/?do=search'
32 '&{query}'
33 # fmt: on
34)
35# '&startRecord={offset}'
36# '&maximumRecords={limit}'
37
38
39# do search-request
40def request(query, params):
41
42 params['url'] = base_url + search_url.format(query=urlencode({'id': query}))
43
44 return params
45
46
47# get response from search-request
48def response(resp):
49 results = []
50
51 doc = fromstring(resp.text)
52
53 # parse results
54 # Quickhits
55 for r in eval_xpath(doc, '//div[@class="search_quickresult"]/ul/li'):
56 try:
57 res_url = eval_xpath(r, './/a[@class="wikilink1"]/@href')[-1]
58 except: # pylint: disable=bare-except
59 continue
60
61 if not res_url:
62 continue
63
64 title = extract_text(eval_xpath(r, './/a[@class="wikilink1"]/@title'))
65
66 # append result
67 results.append({'title': title, 'content': "", 'url': urljoin(base_url, res_url)})
68
69 # Search results
70 for r in eval_xpath(doc, '//dl[@class="search_results"]/*'):
71 try:
72 if r.tag == "dt":
73 res_url = eval_xpath(r, './/a[@class="wikilink1"]/@href')[-1]
74 title = extract_text(eval_xpath(r, './/a[@class="wikilink1"]/@title'))
75 elif r.tag == "dd":
76 content = extract_text(eval_xpath(r, '.'))
77
78 # append result
79 results.append({'title': title, 'content': content, 'url': urljoin(base_url, res_url)})
80 except: # pylint: disable=bare-except
81 continue
82
83 if not res_url:
84 continue
85
86 # return results
87 return results
response(resp)
Definition doku.py:48
request(query, params)
Definition doku.py:40