diff --git a/.gitignore b/.gitignore index b0df9756..0655eb90 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ __pycache__ build dist venv +test-datastore *.egg-info* .vscode/settings.json diff --git a/changedetectionio/fetch_site_status.py b/changedetectionio/fetch_site_status.py index c0fbf2de..18441385 100644 --- a/changedetectionio/fetch_site_status.py +++ b/changedetectionio/fetch_site_status.py @@ -204,6 +204,20 @@ class perform_site_check(): else: stripped_text_from_html = stripped_text_from_html.encode('utf8') + # 615 Extract text by regex + extract_text = watch.get('extract_text', []) + if len(extract_text) > 0: + regex_matched_output = [] + for s_re in extract_text: + result = re.findall(s_re.encode('utf8'), stripped_text_from_html, + flags=re.MULTILINE | re.DOTALL | re.LOCALE) + if result: + regex_matched_output.append(result[0]) + + if regex_matched_output: + stripped_text_from_html = b'\n'.join(regex_matched_output) + text_content_before_ignored_filter = stripped_text_from_html + # Re #133 - if we should strip whitespaces from triggering the change detected comparison if self.datastore.data['settings']['application'].get('ignore_whitespace', False): fetched_md5 = hashlib.md5(stripped_text_from_html.translate(None, b'\r\n\t ')).hexdigest() @@ -221,6 +235,7 @@ class perform_site_check(): # Yeah, lets block first until something matches blocked_by_not_found_trigger_text = True # Filter and trigger works the same, so reuse it + # It should return the line numbers that match result = html_tools.strip_ignore_text(content=str(stripped_text_from_html), wordlist=watch['trigger_text'], mode="line numbers") diff --git a/changedetectionio/forms.py b/changedetectionio/forms.py index e6f41978..38d9f8b1 100644 --- a/changedetectionio/forms.py +++ b/changedetectionio/forms.py @@ -223,7 +223,7 @@ class validateURL(object): except validators.ValidationFailure: message = field.gettext('\'%s\' is not a valid URL.' % (field.data.strip())) raise ValidationError(message) - + class ValidateListRegex(object): """ Validates that anything that looks like a regex passes as a regex @@ -330,6 +330,9 @@ class watchForm(commonSettingsForm): css_filter = StringField('CSS/JSON/XPATH Filter', [ValidateCSSJSONXPATHInput()], default='') subtractive_selectors = StringListField('Remove elements', [ValidateCSSJSONXPATHInput(allow_xpath=False, allow_json=False)]) + + extract_text = StringListField('Extract text', [ValidateListRegex()]) + title = StringField('Title', default='') ignore_text = StringListField('Ignore text', [ValidateListRegex()]) diff --git a/changedetectionio/model/Watch.py b/changedetectionio/model/Watch.py index cde2f456..56f7ca84 100644 --- a/changedetectionio/model/Watch.py +++ b/changedetectionio/model/Watch.py @@ -35,7 +35,8 @@ class model(dict): 'notification_title': default_notification_title, 'notification_body': default_notification_body, 'notification_format': default_notification_format, - 'css_filter': "", + 'css_filter': '', + 'extract_text': [], # Extract text by regex after filters 'subtractive_selectors': [], 'trigger_text': [], # List of text or regex to wait for until a change is detected 'fetch_backend': None, diff --git a/changedetectionio/templates/edit.html b/changedetectionio/templates/edit.html index bf5e7aa3..32fab8ae 100644 --- a/changedetectionio/templates/edit.html +++ b/changedetectionio/templates/edit.html @@ -199,6 +199,17 @@ nav +
Which is across multiple lines
+ + So let's see what happens. +which has this one new line
+ + So let's see what happens. +