diff --git a/setup.cfg b/setup.cfg index 4179fe0bd0dc0d6a8ddaf6a4e88865090eb6c119..5c92ae5aee3d6f98f421d93558321017b807e316 100644 --- a/setup.cfg +++ b/setup.cfg @@ -18,7 +18,8 @@ tests = woob.tools.capabilities.bank.iban, woob.browser.filters.standard, woob.browser.tests.form, woob.browser.tests.filters, - woob.browser.tests.url + woob.browser.tests.url, + woob.browser.tests.xpath_functions [isort] known_first_party = woob, weboob diff --git a/woob/browser/pages.py b/woob/browser/pages.py index fbb2075d99ba3197462dfd112dd7accbb7196597..7c7bfcf6f3cc8ea0b4ac6f287513485f5f25571b 100644 --- a/woob/browser/pages.py +++ b/woob/browser/pages.py @@ -19,19 +19,18 @@ from __future__ import absolute_import -from collections import OrderedDict -from functools import wraps -import warnings -from io import BytesIO, StringIO import codecs -from cgi import parse_header -from functools import reduce import re import sys +import warnings +from cgi import parse_header +from collections import OrderedDict +from functools import reduce, wraps +from io import BytesIO, StringIO import requests -from woob.exceptions import ParseError, ModuleInstallError +from woob.exceptions import ModuleInstallError, ParseError from woob.tools.compat import basestring, unicode, urljoin from woob.tools.json import json, mini_jsonpath from woob.tools.log import getLogger @@ -675,11 +674,15 @@ def first_non_empty(context, *nodes_list): return nodes return [] + def distinct_values(context, text): + return list(set(text)) + ns['has-class'] = has_class ns['starts-with'] = starts_with ns['ends-with'] = ends_with ns['matches'] = matches ns['first-non-empty'] = first_non_empty + ns['distinct-values'] = distinct_values def build_doc(self, content): """ diff --git a/woob/browser/tests/xpath_functions.py b/woob/browser/tests/xpath_functions.py new file mode 100644 index 0000000000000000000000000000000000000000..e989bf98365b722cd6fd925ff835c04dd50b4759 --- /dev/null +++ b/woob/browser/tests/xpath_functions.py @@ -0,0 +1,52 @@ +from lxml.html import fromstring + +from woob.tools.test import TestCase + + +class DistinctValuesTest(TestCase): + def setUp(self): + self.identity = fromstring(''' +
+