Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions docs/supported_publishers.md
Original file line number Diff line number Diff line change
Expand Up @@ -1355,9 +1355,7 @@
<td>
<code>de</code>
</td>
<td>
<code>topics</code>
</td>
<td>&#160;</td>
<td>&#160;</td>
<td>&#160;</td>
</tr>
Expand Down
22 changes: 21 additions & 1 deletion src/fundus/publishers/de/zdf.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,17 @@
extract_article_body_with_selector,
generic_author_parsing,
generic_date_parsing,
generic_topic_parsing,
image_extraction,
strip_nodes_to_text,
)


class ZDFParser(ParserProxy):
class V1(BaseParser):
_paragraph_selector = CSSSelector("div.r1nj4qn5")
VALID_UNTIL = datetime.date(2025, 8, 1) # This date could not be verified exactly

_paragraph_selector = XPath("//div[contains(@class,'r1nj4qn5')]")
_summary_selector = CSSSelector("p.c1bdz7f4")
_subheadlines_selector = CSSSelector("h2.hhhtovw")

Expand Down Expand Up @@ -51,3 +55,19 @@ def images(self) -> List[Image]:
caption_selector=XPath("./ancestor::div[@class='c1owvrps c10o8fzf']//span[@class='c1pbsmr2']"),
lower_boundary_selector=XPath("//div[@class='s1am5zo f1uhhdhr']"),
)

class V1_1(V1):
VALID_UNTIL = datetime.date.today()

_paragraph_selector = XPath(
"//main/div[@data-testid='text-module']/div[@class='c10o8fzf']/p[@class='r1nj4qn5 rvqyqzi']|"
"//figure/blockquote"
)
_topic_selector = XPath("//div[@class='t130q2hl']//a")

@attribute
def topics(self) -> List[str]:
topic_string = strip_nodes_to_text(self._topic_selector(self.precomputed.doc), join_on=",")
if topic_string is not None:
return generic_topic_parsing(topic_string, delimiter=",")
return []
257 changes: 257 additions & 0 deletions tests/resources/parser/test_data/de/ZDF.json
Original file line number Diff line number Diff line change
Expand Up @@ -400,5 +400,262 @@
],
"publishing_date": "2024-04-22 15:55:00.842000+02:00",
"title": "Deutscher Handel mit Iran: Druck mit Wirtschaftssanktionen?"
},
"V1_1": {
"authors": [
"Manuela Conrad"
],
"body": {
"summary": [
"Wladimir Putin warnt vor einer angeblichen \"Dekolonisierung\" Russlands. Er sieht darin einen Versuch, die \"Föderation zu zerschlagen\". Warum spricht er gerade jetzt davon?"
],
"sections": [
{
"headline": [],
"paragraphs": [
"Im wohl prachtvollsten Raum des Kremlpalasts, im Katharinen-Saal, hat Wladimir Putin gestern die \"Sitzung zur Nationalitätenpolitik\" abgehalten, scheinbar ein Routinetermin. Darin beschwor er die Einheit Russlands und warnte davor, Russland von außen zu zerschlagen:",
"Immer häufiger ist von einer Art Dekolonisierung Russlands die Rede. Im Kern geht es darum, die Russische Föderation zu zerschlagen und uns dieselbe verheerende strategische Niederlage zuzufügen.„",
"Ein Informationskrieg von außen gegen sein Land sei im Gange, so der Kremlchef. Es handele sich um eine Ideologie aggressiver Russophobie: \"Sie haben sogar einen eigenen Begriff geprägt: \"Post-Russland, ein Territorium ohne Souveränität, winzige, vom Westen kontrollierte zersplitterte Splitter.\""
]
},
{
"headline": [
"Was will Putin damit sagen und warum jetzt?"
],
"paragraphs": [
"Diese Aussagen des russischen Präsidenten passen ins Kreml-Narrativ: Die Gegner, ob westliche oder ukrainische Geheimdienste, die russische Opposition im Ausland, der Westen allgemein - sie alle hätten sich gegen Russland verbündet. Diese Gegner würden ethnische Unruhen schüren, Russland angeblich zerteilen und die Souveränität des Landes zerstören wollen.",
"Das Narrativ sei nichts Neues, meint Russlandexperte Nico Lange. Aber warum zelebriert Putin gerade jetzt die Einheit Russlands? Es gäbe derzeit viel Unmut über die sogenannte \"asymmetrische\" Mobilisierung der ethnischen Minderheiten, so Lange. Besonders in Dagestan oder in Burjatien, an der Grenze zur Mongolei, würden überproportional viele Männer in die Ukraine geschickt. Viele von ihnen kehren nicht zurück. Man habe das mit Geld lösen wollen, aber der Frust darüber sei groß. Außerdem müsse Putin in dieser Phase, wo er im Ukraine-Krieg kaum große Erfolge vorzuweisen hat, wie man so schön sagt, den \"Laden zusammenhalten\", erklärt Lange.",
"Weil viele Männer im Krieg sterben, viele Ressourcen für den Krieg aufgewendet werden, die finanziellen Ressourcen zurückgehen, will Putin das System, diese vielen Nationalitäten in der russischen Föderation zusammenhalten, so wie früher, mit Zuckerbrot und Peitsche. Das kriegt man in Russland im Moment nicht mehr oder nur noch bedingt hin.„",
"Laut Russlandexperte Lange steckt aber noch mehr dahinter: Nämlich seine eigene biografische Erfahrung - als Putin den Zusammenbruch der Sowjetunion erlebte und sich einige Nationalrepubliken später von Russland abspalteten. Für den Kremlchef war der Zerfall der Sowjetunion im Nachhinein die größte Katastrophe, sagte er einmal. Ein scheinbar stabiles System bricht über Nacht zusammen. Dieser Fakt treibt Putin heute an, ständig an seinem Machterhalt zu arbeiten, so Lange. Ein Mittel für ihn: Die Kontrolle der Zivilgesellschaft."
]
},
{
"headline": [
"Derzeit keine separatistischen Bewegungen in Russland"
],
"paragraphs": [
"In der Kolonialismus-Forschung gilt Russland als Imperium, das keine Kolonien in Übersee erobert hat, sondern sich durch Unterwerfung seiner Nachbarvölker ausgedehnt hat - in Osteuropa, Sibirien, im Kaukasus und in Zentralasien.",
"Seit der Niederschlagung des Unabhängigkeitsstrebens von Tschetschenien im Nordkaukasus gibt es in Russland keine separatistischen Bewegungen mehr. Politologen schließen aber nicht aus, dass bei einer Niederlage im Ukraine-Krieg oder einem Sturz Putins nicht-russische Landesteile wie Tatarstan oder Jakutien von Moskau abfallen könnten. Die Äußerungen des Kremlchefs deuten an, dass er sich solcher Diskussionen bewusst ist."
]
},
{
"headline": [
"Putin will Mitgefühl oder Verständnis für Ukraine verhindern"
],
"paragraphs": [
"Die Russische Föderation hat mehr als 190 verschiedene ethnische Gruppen und besteht aus 21 nationalen Republiken. In der Sowjetunion waren es sogenannte Autonome Republiken, heute haben sie zwar eingesetzte Gouverneure, werden aber de facto von Moskau regiert. Doch die Republiken Tatarstan, Jakutien, Dagestan, Baschkortostan und Tschuwaschien pflegen alle ihr eigenes Brauchtum, ihre Sprache und ihre Kultur. In den Schulen wird zwar russisch gesprochen, aber in Kasan, der Hauptstadt der bevölkerungsreichsten Republik Tatarstan, wird auch tatarisch gelehrt.",
"Jakutien ist ökonomisch stark und eine der Republiken, in denen sich die Menschen gerne von den Russen abgrenzen wollen. Sie sind stolz auf ihre Kultur und ihr Brauchtum und betrachten die Russen eher misstrauisch. Ein Problem sei für Putin der moralische Faktor, den die nationalen Minderheiten mit dem Krieg der Russen haben. Ihm dürfte es nicht entgangen sein, dass es weit weg von Moskau Mitgefühl oder Verständnis für die ukrainische Seite gibt. Wenn sich Menschen, die nicht der russischen Ethnie zugehörig fühlen, vom Krieg der russischen Armee distanzierten, ist ihm das ein Dorn im Auge. Mit der Sitzung wollte Putin also bewusst auf die nationale Einheit Russlands hinweisen, \"um vorzubeugen, dass sie nicht die Gelegenheit hätten, zu sagen, das war alles Moskau\", so Russlandexperte Lange."
]
},
{
"headline": [
"Putin: Zwei neue Feiertage"
],
"paragraphs": [
"Am Ende seiner Rede verkündete Kremlchef Putin zwei neue Feiertage mit klangvollen Namen: Am 30. April soll \"der Tag der indigenen Minderheiten\" begangen werden und am 8. September der \"Tag der Sprachen der Völker der russischen Föderation\". Die neuen Feiertage sind wohl auch ein kleines Zuckerbrot, um etwaiges Grummeln in den Weiten des russischen Landes gar nicht erst aufkommen zu lassen.",
"Manuela Conrad ist ZDF-Reporterin für das Berichtsgebiet Russland, Kaukasus und Zentralasien.",
"Aktuelle Meldungen zu Russlands Angriff auf die Ukraine finden Sie jederzeit in unserem Liveblog:"
]
}
]
},
"images": [
{
"versions": [
{
"url": "https://www.zdfheute.de/assets/putin-240~276x155?cb=1762398327686",
"query_width": null,
"size": {
"width": 276,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/putin-240~384x216?cb=1762398327686",
"query_width": null,
"size": {
"width": 384,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/putin-240~768x432?cb=1762398327686",
"query_width": null,
"size": {
"width": 768,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/putin-240~1280x720?cb=1762398327686",
"query_width": null,
"size": {
"width": 1280,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/putin-240~1920x1080?cb=1762398327686",
"query_width": null,
"size": {
"width": 1920,
"height": 0
},
"type": null
}
],
"is_cover": true,
"description": "Russlands Präsident Putin",
"caption": null,
"authors": [],
"position": 401
},
{
"versions": [
{
"url": "https://www.zdfheute.de/assets/25-imago-imagesimago-images-u17-10-court-hearing-of-vocalist-diana-loginova-stage-name-noako-100~384x216?cb=1761510275873",
"query_width": null,
"size": {
"width": 384,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/25-imago-imagesimago-images-u17-10-court-hearing-of-vocalist-diana-loginova-stage-name-noako-100~768x432?cb=1761510275873",
"query_width": null,
"size": {
"width": 768,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/25-imago-imagesimago-images-u17-10-court-hearing-of-vocalist-diana-loginova-stage-name-noako-100~1280x720?cb=1761510275873",
"query_width": null,
"size": {
"width": 1280,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/25-imago-imagesimago-images-u17-10-court-hearing-of-vocalist-diana-loginova-stage-name-noako-100~1920x1080?cb=1761510275873",
"query_width": null,
"size": {
"width": 1920,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/25-imago-imagesimago-images-u17-10-court-hearing-of-vocalist-diana-loginova-stage-name-noako-100~2400x1350?cb=1761510275873",
"query_width": null,
"size": {
"width": 2400,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/25-imago-imagesimago-images-u17-10-court-hearing-of-vocalist-diana-loginova-stage-name-noako-100~3840x2160?cb=1761510275873",
"query_width": null,
"size": {
"width": 3840,
"height": 0
},
"type": null
}
],
"is_cover": false,
"description": "Gerichtsverhandlung gegen die Sängerin Diana Loginova, Künstlername Noako, in Sankt Petersburg – 16. Oktober 2025 Diana Loginova, Sängerin der Band Stoptime, die unter dem Künstlernamen Noako auftritt und nach der öffentlichen Aufführung von Liedern ausländischer Agenten sowie eines Liedes von Noize MC, dessen Verbreitung verboten ist, festgenommen wurde, nimmt an einer Gerichtsverhandlung teil.",
"caption": null,
"authors": [],
"position": 426
},
{
"versions": [
{
"url": "https://www.zdfheute.de/assets/nico-lange-102~276x155?cb=1669732645738",
"query_width": null,
"size": {
"width": 276,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/nico-lange-102~384x216?cb=1669732645738",
"query_width": null,
"size": {
"width": 384,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/nico-lange-102~768x432?cb=1669732645738",
"query_width": null,
"size": {
"width": 768,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/nico-lange-102~1280x720?cb=1669732645738",
"query_width": null,
"size": {
"width": 1280,
"height": 0
},
"type": null
},
{
"url": "https://www.zdfheute.de/assets/nico-lange-102~1920x1080?cb=1669732645738",
"query_width": null,
"size": {
"width": 1920,
"height": 0
},
"type": null
}
],
"is_cover": false,
"description": "Nico Lange",
"caption": null,
"authors": [],
"position": 465
},
{
"versions": [
{
"url": "https://www.zdfheute.de/assets/jugendliche-gefangene-russland-100~384x216?cb=1725558742365",
"query_width": null,
"size": {
"width": 384,
"height": 0
},
"type": null
}
],
"is_cover": false,
"description": "Ein jugendlicher Gefangener steht hinter Gittern.",
"caption": null,
"authors": [],
"position": 483
}
],
"publishing_date": "2025-11-06 04:05:23.161000+01:00",
"title": "Putin spricht von Versuch der Zerschlagung Russlands wegen angeblicher Dekolonisierung",
"topics": [
"Ukraine",
"Russland",
"Wladimir Putin"
]
}
}
Binary file not shown.
4 changes: 4 additions & 0 deletions tests/resources/parser/test_data/de/meta.info
Original file line number Diff line number Diff line change
Expand Up @@ -274,5 +274,9 @@
"ZDF_2024_04_22.html.gz": {
"url": "https://www.zdf.de/nachrichten/wirtschaft/deutschland-iran-handel-sanktionen-100.html",
"crawl_date": "2024-04-22 17:22:43.812721"
},
"ZDF_2025_11_07.html.gz": {
"url": "https://www.zdfheute.de/politik/ausland/putin-warnung-dekolonisierung-russland-100.html",
"crawl_date": "2025-11-07 00:28:51.330920"
}
}