.oO SearXNG Developer Documentation Oo.
|
Classes | |
class | _HTMLTextExtractor |
class | _HTMLTextExtractorException |
class | _NotSetClass |
Functions | |
str | searx_useragent () |
str | gen_useragent (Optional[str] os_string=None) |
str | html_to_text (str html_str) |
str | markdown_to_text (str markdown_str) |
Optional[str] | extract_text (xpath_results, bool allow_none=False) |
str | normalize_url (str url, str base_url) |
str | extract_url (xpath_results, base_url) |
Dict | dict_subset (MutableMapping dictionary, Set[str] properties) |
humanize_bytes (size, precision=2) | |
humanize_number (size, precision=0) | |
int | convert_str_to_int (str number_str) |
extr (str txt, str begin, str end, str default="") | |
int | int_or_zero (Union[List[str], str] num) |
Optional[Tuple[bool, str, str]] | is_valid_lang (lang) |
types.ModuleType | load_module (str filename, str module_dir) |
str | to_string (Any obj) |
str | ecma_unescape (str string) |
Callable[[str], str] | get_string_replaces_function (Dict[str, str] replaces) |
Dict | get_engine_from_settings (str name) |
XPath | get_xpath (XPathSpecType xpath_spec) |
eval_xpath (ElementBase element, XPathSpecType xpath_spec) | |
eval_xpath_list (ElementBase element, XPathSpecType xpath_spec, Optional[int] min_len=None) | |
eval_xpath_getindex (ElementBase elements, XPathSpecType xpath_spec, int index, default=_NOTSET) | |
"fasttext.FastText._FastText" | _get_fasttext_model () |
get_embeded_stream_url (url) | |
Optional[str] | detect_language (str text, float threshold=0.3, bool only_search_languages=False) |
js_variable_to_python (js_variable) | |
Variables | |
logger = logger.getChild('utils') | |
XPathSpecType = Union[str, XPath] | |
tuple | _BLOCKED_TAGS = ('script', 'style') |
_ECMA_UNESCAPE4_RE = re.compile(r'%u([0-9a-fA-F]{4})', re.UNICODE) | |
_ECMA_UNESCAPE2_RE = re.compile(r'%([0-9a-fA-F]{2})', re.UNICODE) | |
_JS_QUOTE_KEYS_RE = re.compile(r'([\{\s,])(\w+)(:)') | |
_JS_VOID_RE = re.compile(r'void\s+[0-9]+|void\s*\([0-9]+\)') | |
_JS_DECIMAL_RE = re.compile(r":\s*\.") | |
dict | _XPATH_CACHE = {} |
dict | _LANG_TO_LC_CACHE = {} |
Optional | _FASTTEXT_MODEL = None |
SEARCH_LANGUAGE_CODES = frozenset([searxng_locale[0].split('-')[0] for searxng_locale in sxng_locales]) | |
_NOTSET = _NotSetClass() | |
Utility functions for the engines
|
protected |
Definition at line 607 of file utils.py.
Referenced by searx.utils.detect_language().
int searx.utils.convert_str_to_int | ( | str | number_str | ) |
Convert number_str to int or 0 if number_str is not a number.
Definition at line 349 of file utils.py.
Referenced by searx.utils.int_or_zero().
Optional[str] searx.utils.detect_language | ( | str | text, |
float | threshold = 0.3, | ||
bool | only_search_languages = False ) |
Detect the language of the ``text`` parameter. :param str text: The string whose language is to be detected. :param float threshold: Threshold filters the returned labels by a threshold on probability. A choice of 0.3 will return labels with at least 0.3 probability. :param bool only_search_languages: If ``True``, returns only supported SearXNG search languages. see :py:obj:`searx.languages` :rtype: str, None :returns: The detected language code or ``None``. See below. :raises ValueError: If ``text`` is not a string. The language detection is done by using `a fork`_ of the fastText_ library (`python fasttext`_). fastText_ distributes the `language identification model`_, for reference: - `FastText.zip: Compressing text classification models`_ - `Bag of Tricks for Efficient Text Classification`_ The `language identification model`_ support the language codes (ISO-639-3):: af als am an ar arz as ast av az azb ba bar bcl be bg bh bn bo bpy br bs bxr ca cbk ce ceb ckb co cs cv cy da de diq dsb dty dv el eml en eo es et eu fa fi fr frr fy ga gd gl gn gom gu gv he hi hif hr hsb ht hu hy ia id ie ilo io is it ja jbo jv ka kk km kn ko krc ku kv kw ky la lb lez li lmo lo lrc lt lv mai mg mhr min mk ml mn mr mrj ms mt mwl my myv mzn nah nap nds ne new nl nn no oc or os pa pam pfl pl pms pnb ps pt qu rm ro ru rue sa sah sc scn sco sd sh si sk sl so sq sr su sv sw ta te tg th tk tl tr tt tyv ug uk ur uz vec vep vi vls vo wa war wuu xal xmf yi yo yue zh By using ``only_search_languages=True`` the `language identification model`_ is harmonized with the SearXNG's language (locale) model. General conditions of SearXNG's locale model are: a. SearXNG's locale of a query is passed to the :py:obj:`searx.locales.get_engine_locale` to get a language and/or region code that is used by an engine. b. Most of SearXNG's engines do not support all the languages from `language identification model`_ and there is also a discrepancy in the ISO-639-3 (fasttext) and ISO-639-2 (SearXNG)handling. Further more, in SearXNG the locales like ``zh-TH`` (``zh-CN``) are mapped to ``zh_Hant`` (``zh_Hans``) while the `language identification model`_ reduce both to ``zh``. .. _a fork: https://github.com/searxng/fasttext-predict .. _fastText: https://fasttext.cc/ .. _python fasttext: https://pypi.org/project/fasttext/ .. _language identification model: https://fasttext.cc/docs/en/language-identification.html .. _Bag of Tricks for Efficient Text Classification: https://arxiv.org/abs/1607.01759 .. _`FastText.zip: Compressing text classification models`: https://arxiv.org/abs/1612.03651
Definition at line 664 of file utils.py.
References searx.utils._get_fasttext_model().
Dict searx.utils.dict_subset | ( | MutableMapping | dictionary, |
Set[str] | properties ) |
Extract a subset of a dict Examples: >>> dict_subset({'A': 'a', 'B': 'b', 'C': 'c'}, ['A', 'C']) {'A': 'a', 'C': 'c'} >>> >> dict_subset({'A': 'a', 'B': 'b', 'C': 'c'}, ['A', 'D']) {'A': 'a'}
Definition at line 313 of file utils.py.
str searx.utils.ecma_unescape | ( | str | string | ) |
Python implementation of the unescape javascript function https://www.ecma-international.org/ecma-262/6.0/#sec-unescape-string https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/unescape Examples: >>> ecma_unescape('%u5409') '吉' >>> ecma_unescape('%20') ' ' >>> ecma_unescape('%F3') 'ó'
Definition at line 452 of file utils.py.
searx.utils.eval_xpath | ( | ElementBase | element, |
XPathSpecType | xpath_spec ) |
Equivalent of element.xpath(xpath_str) but compile xpath_str once for all. See https://lxml.de/xpathxslt.html#xpath-return-values Args: * element (ElementBase): [description] * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath Returns: * result (bool, float, list, str): Results. Raises: * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath * SearxEngineXPathException: Raise when the XPath can't be evaluated.
Definition at line 530 of file utils.py.
References searx.utils.get_xpath().
searx.utils.eval_xpath_getindex | ( | ElementBase | elements, |
XPathSpecType | xpath_spec, | ||
int | index, | ||
default = _NOTSET ) |
Call eval_xpath_list then get one element using the index parameter. If the index does not exist, either raise an exception is default is not set, other return the default value (can be None). Args: * elements (ElementBase): lxml element to apply the xpath. * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath. * index (int): index to get * default (Object, optional): Defaults if index doesn't exist. Raises: * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath * SearxEngineXPathException: if the index is not found. Also see eval_xpath. Returns: * result (bool, float, list, str): Results.
Definition at line 578 of file utils.py.
searx.utils.eval_xpath_list | ( | ElementBase | element, |
XPathSpecType | xpath_spec, | ||
Optional[int] | min_len = None ) |
Same as eval_xpath, check if the result is a list Args: * element (ElementBase): [description] * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath * min_len (int, optional): [description]. Defaults to None. Raises: * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath * SearxEngineXPathException: raise if the result is not a list Returns: * result (bool, float, list, str): Results.
Definition at line 554 of file utils.py.
searx.utils.extr | ( | str | txt, |
str | begin, | ||
str | end, | ||
str | default = "" ) |
Extract the string between ``begin`` and ``end`` from ``txt`` :param txt: String to search in :param begin: First string to be searched for :param end: Second string to be searched for after ``begin`` :param default: Default value if one of ``begin`` or ``end`` is not found. Defaults to an empty string. :return: The string between the two search-strings ``begin`` and ``end``. If at least one of ``begin`` or ``end`` is not found, the value of ``default`` is returned. Examples: >>> extr("abcde", "a", "e") "bcd" >>> extr("abcde", "a", "z", deafult="nothing") "nothing"
Definition at line 356 of file utils.py.
Optional[str] searx.utils.extract_text | ( | xpath_results, | |
bool | allow_none = False ) |
Extract text from a lxml result * if xpath_results is list, extract the text from each result and concat the list * if xpath_results is a xml element, extract all the text node from it ( text_content() method from lxml ) * if xpath_results is a string element, then it's already done
Definition at line 194 of file utils.py.
str searx.utils.extract_url | ( | xpath_results, | |
base_url ) |
Extract and normalize URL from lxml Element Args: * xpath_results (Union[List[html.HtmlElement], html.HtmlElement]): lxml Element(s) * base_url (str): Base URL Example: >>> def f(s, search_url): >>> return searx.utils.extract_url(html.fromstring(s), search_url) >>> f('<span id="42">https://example.com</span>', 'http://example.com/') 'https://example.com/' >>> f('https://example.com', 'http://example.com/') 'https://example.com/' >>> f('//example.com', 'http://example.com/') 'http://example.com/' >>> f('//example.com', 'https://example.com/') 'https://example.com/' >>> f('/path?a=1', 'https://example.com') 'https://example.com/path?a=1' >>> f('', 'https://example.com') raise lxml.etree.ParserError >>> searx.utils.extract_url([], 'https://example.com') raise ValueError Raises: * ValueError * lxml.etree.ParserError Returns: * str: normalized URL
Definition at line 272 of file utils.py.
References searx.utils.normalize_url().
str searx.utils.gen_useragent | ( | Optional[str] | os_string = None | ) |
Return a random browser User Agent See searx/data/useragents.json
Definition at line 72 of file utils.py.
References searx.format.
searx.utils.get_embeded_stream_url | ( | url | ) |
Converts a standard video URL into its embed format. Supported services include Youtube, Facebook, Instagram, TikTok, and Dailymotion.
Definition at line 618 of file utils.py.
Dict searx.utils.get_engine_from_settings | ( | str | name | ) |
Return engine configuration from settings.yml of a given engine name
Definition at line 483 of file utils.py.
Callable[[str], str] searx.utils.get_string_replaces_function | ( | Dict[str, str] | replaces | ) |
Definition at line 473 of file utils.py.
XPath searx.utils.get_xpath | ( | XPathSpecType | xpath_spec | ) |
Return cached compiled XPath There is no thread lock. Worst case scenario, xpath_str is compiled more than one time. Args: * xpath_spec (str|lxml.etree.XPath): XPath as a str or lxml.etree.XPath Returns: * result (bool, float, list, str): Results. Raises: * TypeError: Raise when xpath_spec is neither a str nor a lxml.etree.XPath * SearxXPathSyntaxException: Raise when there is a syntax error in the XPath
Definition at line 498 of file utils.py.
Referenced by searx.utils.eval_xpath().
str searx.utils.html_to_text | ( | str | html_str | ) |
Extract text from a HTML string Args: * html_str (str): string HTML Returns: * str: extracted text Examples: >>> html_to_text('Example <span id="42">#2</span>') 'Example #2' >>> html_to_text('<style>.span { color: red; }</style><span>Example</span>') 'Example' >>> html_to_text(r'regexp: (?<![a-zA-Z]') 'regexp: (?<![a-zA-Z]'
Definition at line 139 of file utils.py.
searx.utils.humanize_bytes | ( | size, | |
precision = 2 ) |
Determine the *human readable* value of bytes on 1024 base (1KB=1024B).
Definition at line 325 of file utils.py.
searx.utils.humanize_number | ( | size, | |
precision = 0 ) |
Determine the *human readable* value of a decimal number.
Definition at line 337 of file utils.py.
int searx.utils.int_or_zero | ( | Union[List[str], str] | num | ) |
Convert num to int or 0. num can be either a str or a list. If num is a list, the first element is converted to int (or return 0 if the list is empty). If num is a str, see convert_str_to_int
Definition at line 385 of file utils.py.
References searx.utils.convert_str_to_int().
Optional[Tuple[bool, str, str]] searx.utils.is_valid_lang | ( | lang | ) |
Return language code and name if lang describe a language. Examples: >>> is_valid_lang('zz') None >>> is_valid_lang('uk') (True, 'uk', 'ukrainian') >>> is_valid_lang(b'uk') (True, 'uk', 'ukrainian') >>> is_valid_lang('en') (True, 'en', 'english') >>> searx.utils.is_valid_lang('Español') (True, 'es', 'spanish') >>> searx.utils.is_valid_lang('Spanish') (True, 'es', 'spanish')
Definition at line 397 of file utils.py.
searx.utils.js_variable_to_python | ( | js_variable | ) |
Convert a javascript variable into JSON and then load the value It does not deal with all cases, but it is good enough for now. chompjs has a better implementation.
Definition at line 735 of file utils.py.
types.ModuleType searx.utils.load_module | ( | str | filename, |
str | module_dir ) |
Definition at line 429 of file utils.py.
str searx.utils.markdown_to_text | ( | str | markdown_str | ) |
Extract text from a Markdown string Args: * markdown_str (str): string Markdown Returns: * str: extracted text Examples: >>> markdown_to_text('[example](https://example.com)') 'example' >>> markdown_to_text('## Headline') 'Headline'
Definition at line 171 of file utils.py.
str searx.utils.normalize_url | ( | str | url, |
str | base_url ) |
Normalize URL: add protocol, join URL with base_url, add trailing slash if there is no path Args: * url (str): Relative URL * base_url (str): Base URL, it must be an absolute URL. Example: >>> normalize_url('https://example.com', 'http://example.com/') 'https://example.com/' >>> normalize_url('//example.com', 'http://example.com/') 'http://example.com/' >>> normalize_url('//example.com', 'https://example.com/') 'https://example.com/' >>> normalize_url('/path?a=1', 'https://example.com') 'https://example.com/path?a=1' >>> normalize_url('', 'https://example.com') 'https://example.com/' >>> normalize_url('/test', '/path') raise ValueError Raises: * lxml.etree.ParserError Returns: * str: normalized URL
Definition at line 222 of file utils.py.
References searx.format.
Referenced by searx.utils.extract_url().
str searx.utils.searx_useragent | ( | ) |
Return the searx User Agent
Definition at line 65 of file utils.py.
References searx.format.
str searx.utils.to_string | ( | Any | obj | ) |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
|
protected |
searx.utils.SEARCH_LANGUAGE_CODES = frozenset([searxng_locale[0].split('-')[0] for searxng_locale in sxng_locales]) |