From 909395d9d120286331e47844b2da79e568e32a1d Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Tue, 30 Jan 2024 16:14:46 +0100 Subject: [PATCH 1/6] Update DW Version --- src/fundus/parser/utility.py | 4 ++-- src/fundus/publishers/de/dw.py | 15 +++++++++++++++ tests/resources/parser/test_data/de/DW.json | 11 +++++++++++ .../parser/test_data/de/DW_2024_01_30.html.gz | Bin 0 -> 48398 bytes tests/resources/parser/test_data/de/meta.info | 4 ++++ 5 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 tests/resources/parser/test_data/de/DW_2024_01_30.html.gz diff --git a/src/fundus/parser/utility.py b/src/fundus/parser/utility.py index 805969bc8..7a9c1a335 100644 --- a/src/fundus/parser/utility.py +++ b/src/fundus/parser/utility.py @@ -132,10 +132,10 @@ def get_meta_content(tree: lxml.html.HtmlElement) -> Dict[str, str]: return meta -def strip_nodes_to_text(text_nodes: List[lxml.html.HtmlElement]) -> Optional[str]: +def strip_nodes_to_text(text_nodes: List[lxml.html.HtmlElement], join_on: str = "\n\n") -> Optional[str]: if not text_nodes: return None - return "\n\n".join(([re.sub(r"\n+", " ", node.text_content()) for node in text_nodes])).strip() + return join_on.join(([re.sub(r"\n+", " ", node.text_content()) for node in text_nodes])).strip() def apply_substitution_pattern_over_list( diff --git a/src/fundus/publishers/de/dw.py b/src/fundus/publishers/de/dw.py index 111620b7c..4b8fce150 100644 --- a/src/fundus/publishers/de/dw.py +++ b/src/fundus/publishers/de/dw.py @@ -13,11 +13,14 @@ generic_date_parsing, generic_text_extraction_with_css, generic_topic_parsing, + strip_nodes_to_text, ) class DWParser(ParserProxy): class V2(BaseParser): + VALID_UNTIL = datetime.date(2024, 1, 18) + _paragraph_selector = CSSSelector("div.rich-text > p") _summary_selector = CSSSelector("header > p") _subheadline_selector = CSSSelector("div.rich-text > h2") @@ -53,6 +56,18 @@ def title(self) -> Optional[str]: def topics(self) -> List[str]: return [node.text_content().strip() for node in self._topic_selector(self.precomputed.doc)] + class V2_1(V2): + VALID_UNTIL = datetime.date.today() + + _topic_selector = CSSSelector("header > div.kicker > span") + + @attribute + def topics(self) -> List[str]: + topic_nodes = self._topic_selector(self.precomputed.doc) + if (topic_string := strip_nodes_to_text(topic_nodes, join_on=", ")) is not None: + return topic_string.split(", ") + return [] + class V1(BaseParser): VALID_UNTIL = datetime.date(2023, 6, 12) diff --git a/tests/resources/parser/test_data/de/DW.json b/tests/resources/parser/test_data/de/DW.json index abbed534e..2e121628d 100644 --- a/tests/resources/parser/test_data/de/DW.json +++ b/tests/resources/parser/test_data/de/DW.json @@ -25,5 +25,16 @@ "Long COVID", "Coronavirus" ] + }, + "V2_1": { + "authors": [ + "Jennifer Pahlke" + ], + "publishing_date": "2024-01-30 14:13:12.269000+00:00", + "title": "Russland-Wahl: Nadeschdin setzt auf ein Ende der Putin-Ära", + "topics": [ + "Politik", + "Russische Föderation" + ] } } diff --git a/tests/resources/parser/test_data/de/DW_2024_01_30.html.gz b/tests/resources/parser/test_data/de/DW_2024_01_30.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..0d7653e83aa54869e8982ba18e59ffa4b8741f1a GIT binary patch literal 48398 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 Date: Thu, 1 Feb 2024 17:42:20 +0100 Subject: [PATCH 2/6] update _paragraph_selector --- src/fundus/publishers/de/dw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fundus/publishers/de/dw.py b/src/fundus/publishers/de/dw.py index 4b8fce150..819905758 100644 --- a/src/fundus/publishers/de/dw.py +++ b/src/fundus/publishers/de/dw.py @@ -21,7 +21,7 @@ class DWParser(ParserProxy): class V2(BaseParser): VALID_UNTIL = datetime.date(2024, 1, 18) - _paragraph_selector = CSSSelector("div.rich-text > p") + _paragraph_selector = XPath("//div[contains(@class, 'rich-text')] /p[not(em) or text()]") _summary_selector = CSSSelector("header > p") _subheadline_selector = CSSSelector("div.rich-text > h2") From 68a2168dce1df24a17f58e4da2b40b791d4bf437 Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Tue, 6 Feb 2024 15:49:02 +0100 Subject: [PATCH 3/6] Adds comment about `_paragraph_selector` --- src/fundus/publishers/de/dw.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/fundus/publishers/de/dw.py b/src/fundus/publishers/de/dw.py index 819905758..77ef91b52 100644 --- a/src/fundus/publishers/de/dw.py +++ b/src/fundus/publishers/de/dw.py @@ -21,6 +21,10 @@ class DWParser(ParserProxy): class V2(BaseParser): VALID_UNTIL = datetime.date(2024, 1, 18) + # There is a little author line at the end of the nodes gathered by the paragraph selector, + # which seems to be rather hard to omit. Some examples: + # AR/jj (dpa, rtr, ap), kle/jj (kna, dpa, rtr, afp), pg/AR/kle (dpa, afp), + # pg/AR/haz (afp, dpa), kle/haz (dpa, rtr, afp) _paragraph_selector = XPath("//div[contains(@class, 'rich-text')] /p[not(em) or text()]") _summary_selector = CSSSelector("header > p") _subheadline_selector = CSSSelector("div.rich-text > h2") From 40fd1a8d2f423d8eecafa936616e37ce187dd253 Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Thu, 8 Feb 2024 15:49:35 +0100 Subject: [PATCH 4/6] add author byline regex --- src/fundus/publishers/de/dw.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/fundus/publishers/de/dw.py b/src/fundus/publishers/de/dw.py index 77ef91b52..cbe586b4d 100644 --- a/src/fundus/publishers/de/dw.py +++ b/src/fundus/publishers/de/dw.py @@ -20,12 +20,12 @@ class DWParser(ParserProxy): class V2(BaseParser): VALID_UNTIL = datetime.date(2024, 1, 18) - - # There is a little author line at the end of the nodes gathered by the paragraph selector, - # which seems to be rather hard to omit. Some examples: - # AR/jj (dpa, rtr, ap), kle/jj (kna, dpa, rtr, afp), pg/AR/kle (dpa, afp), - # pg/AR/haz (afp, dpa), kle/haz (dpa, rtr, afp) - _paragraph_selector = XPath("//div[contains(@class, 'rich-text')] /p[not(em) or text()]") + # https://regex101.com/r/uZLwyb/1 + _author_regex = r"^([a-z]{2,3}\/|[A-Z]{2,3}\/)*([a-z]{2,3}|[A-Z]{2,3})\s\(([a-z]{2,3}, )*([a-z]{2,3})\)$" + _paragraph_selector = XPath( + f"//div[contains(@class, 'rich-text')] /p[not(em) or text() and not(re:test(text(), '{_author_regex}'))]", + namespaces={"re": "http://exslt.org/regular-expressions"}, + ) _summary_selector = CSSSelector("header > p") _subheadline_selector = CSSSelector("div.rich-text > h2") From a9c44e2fae49b8c5510dbdaf3f4b15e3b7d626fa Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Mon, 12 Feb 2024 14:46:29 +0100 Subject: [PATCH 5/6] add regex to paragraph selector --- src/fundus/publishers/de/dw.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fundus/publishers/de/dw.py b/src/fundus/publishers/de/dw.py index cbe586b4d..28ec46c36 100644 --- a/src/fundus/publishers/de/dw.py +++ b/src/fundus/publishers/de/dw.py @@ -23,7 +23,7 @@ class V2(BaseParser): # https://regex101.com/r/uZLwyb/1 _author_regex = r"^([a-z]{2,3}\/|[A-Z]{2,3}\/)*([a-z]{2,3}|[A-Z]{2,3})\s\(([a-z]{2,3}, )*([a-z]{2,3})\)$" _paragraph_selector = XPath( - f"//div[contains(@class, 'rich-text')] /p[not(em) or text() and not(re:test(text(), '{_author_regex}'))]", + f"//div[contains(@class, 'rich-text')] /p[text() and not(re:test(text(), '{_author_regex}'))]", namespaces={"re": "http://exslt.org/regular-expressions"}, ) _summary_selector = CSSSelector("header > p") From 17cee4c6eabb03262d799f28a04a5519f2efe0eb Mon Sep 17 00:00:00 2001 From: Max Dallabetta Date: Mon, 12 Feb 2024 17:23:15 +0100 Subject: [PATCH 6/6] changed regex slightly --- src/fundus/publishers/de/dw.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fundus/publishers/de/dw.py b/src/fundus/publishers/de/dw.py index 28ec46c36..061b75a12 100644 --- a/src/fundus/publishers/de/dw.py +++ b/src/fundus/publishers/de/dw.py @@ -20,8 +20,8 @@ class DWParser(ParserProxy): class V2(BaseParser): VALID_UNTIL = datetime.date(2024, 1, 18) - # https://regex101.com/r/uZLwyb/1 - _author_regex = r"^([a-z]{2,3}\/|[A-Z]{2,3}\/)*([a-z]{2,3}|[A-Z]{2,3})\s\(([a-z]{2,3}, )*([a-z]{2,3})\)$" + # https://regex101.com/r/Xsadk5/1 + _author_regex = r"^([A-z]{2,3}\/)*([A-z]{2,3})\s\([A-z\s,\d]*\)$" _paragraph_selector = XPath( f"//div[contains(@class, 'rich-text')] /p[text() and not(re:test(text(), '{_author_regex}'))]", namespaces={"re": "http://exslt.org/regular-expressions"},