Skip to content

Commit 53e04de

Browse files
authored
Merge pull request #825 from flairNLP/fix-zdf
Add `V1_1` for `ZDF`
2 parents de36e7a + 83b49a2 commit 53e04de

File tree

5 files changed

+295
-6
lines changed

5 files changed

+295
-6
lines changed

docs/supported_publishers.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1374,9 +1374,7 @@
13741374
<td>
13751375
<code>de</code>
13761376
</td>
1377-
<td>
1378-
<code>topics</code>
1379-
</td>
1377+
<td>&#160;</td>
13801378
<td>&#160;</td>
13811379
<td>&#160;</td>
13821380
</tr>

src/fundus/publishers/de/zdf.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@
99
extract_article_body_with_selector,
1010
generic_author_parsing,
1111
generic_date_parsing,
12+
generic_topic_parsing,
1213
image_extraction,
14+
strip_nodes_to_text,
1315
)
1416

1517

1618
class ZDFParser(ParserProxy):
1719
class V1(BaseParser):
18-
_paragraph_selector = CSSSelector("div.r1nj4qn5")
20+
VALID_UNTIL = datetime.date(2025, 8, 1) # This date could not be verified exactly
21+
22+
_paragraph_selector = XPath("//div[contains(@class,'r1nj4qn5')]")
1923
_summary_selector = CSSSelector("p.c1bdz7f4")
2024
_subheadlines_selector = CSSSelector("h2.hhhtovw")
2125

@@ -46,8 +50,30 @@ def images(self) -> List[Image]:
4650
doc=self.precomputed.doc,
4751
paragraph_selector=self._paragraph_selector,
4852
image_selector=XPath(
49-
"//picture//img[not(contains(@class, 'error') or contains(@src, 'zdfheute-whatsapp-channel'))]"
53+
"//picture//img[not(contains(@class, 'error') or contains(@src, 'zdfheute-whatsapp-channel'))"
54+
" or contains(@alt, 'Autorenfoto')]"
55+
),
56+
caption_selector=XPath(
57+
"./ancestor::*[(self::div and @class='c1owvrps c10o8fzf') or self::figure]//*[contains(@class,'c1pbsmr2')]"
58+
),
59+
author_selector=XPath(
60+
"./ancestor::*[(self::div and @class='c1owvrps c10o8fzf') or self::figure]//small[contains(@class, 'tsdggcs')]"
5061
),
51-
caption_selector=XPath("./ancestor::div[@class='c1owvrps c10o8fzf']//span[@class='c1pbsmr2']"),
5262
lower_boundary_selector=XPath("//div[@class='s1am5zo f1uhhdhr']"),
5363
)
64+
65+
class V1_1(V1):
66+
VALID_UNTIL = datetime.date.today()
67+
68+
_paragraph_selector = XPath(
69+
"//main/div[@data-testid='text-module']/div[@class='c10o8fzf']/p[@class='r1nj4qn5 rvqyqzi']|"
70+
"//figure/blockquote"
71+
)
72+
_topic_selector = XPath("//div[@class='t130q2hl']//a")
73+
74+
@attribute
75+
def topics(self) -> List[str]:
76+
topic_string = strip_nodes_to_text(self._topic_selector(self.precomputed.doc), join_on=",")
77+
if topic_string is not None:
78+
return generic_topic_parsing(topic_string, delimiter=",")
79+
return []

tests/resources/parser/test_data/de/ZDF.json

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,5 +400,266 @@
400400
],
401401
"publishing_date": "2024-04-22 15:55:00.842000+02:00",
402402
"title": "Deutscher Handel mit Iran: Druck mit Wirtschaftssanktionen?"
403+
},
404+
"V1_1": {
405+
"authors": [
406+
"Manuela Conrad"
407+
],
408+
"body": {
409+
"summary": [
410+
"Wladimir Putin warnt vor einer angeblichen \"Dekolonisierung\" Russlands. Er sieht darin einen Versuch, die \"Föderation zu zerschlagen\". Warum spricht er gerade jetzt davon?"
411+
],
412+
"sections": [
413+
{
414+
"headline": [],
415+
"paragraphs": [
416+
"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:",
417+
"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.„",
418+
"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.\""
419+
]
420+
},
421+
{
422+
"headline": [
423+
"Was will Putin damit sagen und warum jetzt?"
424+
],
425+
"paragraphs": [
426+
"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.",
427+
"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.",
428+
"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.„",
429+
"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."
430+
]
431+
},
432+
{
433+
"headline": [
434+
"Derzeit keine separatistischen Bewegungen in Russland"
435+
],
436+
"paragraphs": [
437+
"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.",
438+
"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."
439+
]
440+
},
441+
{
442+
"headline": [
443+
"Putin will Mitgefühl oder Verständnis für Ukraine verhindern"
444+
],
445+
"paragraphs": [
446+
"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.",
447+
"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."
448+
]
449+
},
450+
{
451+
"headline": [
452+
"Putin: Zwei neue Feiertage"
453+
],
454+
"paragraphs": [
455+
"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.",
456+
"Manuela Conrad ist ZDF-Reporterin für das Berichtsgebiet Russland, Kaukasus und Zentralasien.",
457+
"Aktuelle Meldungen zu Russlands Angriff auf die Ukraine finden Sie jederzeit in unserem Liveblog:"
458+
]
459+
}
460+
]
461+
},
462+
"images": [
463+
{
464+
"versions": [
465+
{
466+
"url": "https://www.zdfheute.de/assets/putin-240~276x155?cb=1762398327686",
467+
"query_width": null,
468+
"size": {
469+
"width": 276,
470+
"height": 0
471+
},
472+
"type": null
473+
},
474+
{
475+
"url": "https://www.zdfheute.de/assets/putin-240~384x216?cb=1762398327686",
476+
"query_width": null,
477+
"size": {
478+
"width": 384,
479+
"height": 0
480+
},
481+
"type": null
482+
},
483+
{
484+
"url": "https://www.zdfheute.de/assets/putin-240~768x432?cb=1762398327686",
485+
"query_width": null,
486+
"size": {
487+
"width": 768,
488+
"height": 0
489+
},
490+
"type": null
491+
},
492+
{
493+
"url": "https://www.zdfheute.de/assets/putin-240~1280x720?cb=1762398327686",
494+
"query_width": null,
495+
"size": {
496+
"width": 1280,
497+
"height": 0
498+
},
499+
"type": null
500+
},
501+
{
502+
"url": "https://www.zdfheute.de/assets/putin-240~1920x1080?cb=1762398327686",
503+
"query_width": null,
504+
"size": {
505+
"width": 1920,
506+
"height": 0
507+
},
508+
"type": null
509+
}
510+
],
511+
"is_cover": true,
512+
"description": "Russlands Präsident Putin",
513+
"caption": "Russlands Präsident Wladimir Putin hat Behörden dazu angewiesen, schnell auf jeden Fall ethnischer Konflikte zu reagieren.",
514+
"authors": [
515+
"dpa"
516+
],
517+
"position": 401
518+
},
519+
{
520+
"versions": [
521+
{
522+
"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",
523+
"query_width": null,
524+
"size": {
525+
"width": 384,
526+
"height": 0
527+
},
528+
"type": null
529+
},
530+
{
531+
"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",
532+
"query_width": null,
533+
"size": {
534+
"width": 768,
535+
"height": 0
536+
},
537+
"type": null
538+
},
539+
{
540+
"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",
541+
"query_width": null,
542+
"size": {
543+
"width": 1280,
544+
"height": 0
545+
},
546+
"type": null
547+
},
548+
{
549+
"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",
550+
"query_width": null,
551+
"size": {
552+
"width": 1920,
553+
"height": 0
554+
},
555+
"type": null
556+
},
557+
{
558+
"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",
559+
"query_width": null,
560+
"size": {
561+
"width": 2400,
562+
"height": 0
563+
},
564+
"type": null
565+
},
566+
{
567+
"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",
568+
"query_width": null,
569+
"size": {
570+
"width": 3840,
571+
"height": 0
572+
},
573+
"type": null
574+
}
575+
],
576+
"is_cover": false,
577+
"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.",
578+
"caption": "In Russland gehen junge Menschen für Demokratie und eine friedliche Zukunft auf die Straße. Trotz drohender Strafen fordern sie Freiheit - und ein Russland ohne Putin.",
579+
"authors": [],
580+
"position": 426
581+
},
582+
{
583+
"versions": [
584+
{
585+
"url": "https://www.zdfheute.de/assets/nico-lange-102~276x155?cb=1669732645738",
586+
"query_width": null,
587+
"size": {
588+
"width": 276,
589+
"height": 0
590+
},
591+
"type": null
592+
},
593+
{
594+
"url": "https://www.zdfheute.de/assets/nico-lange-102~384x216?cb=1669732645738",
595+
"query_width": null,
596+
"size": {
597+
"width": 384,
598+
"height": 0
599+
},
600+
"type": null
601+
},
602+
{
603+
"url": "https://www.zdfheute.de/assets/nico-lange-102~768x432?cb=1669732645738",
604+
"query_width": null,
605+
"size": {
606+
"width": 768,
607+
"height": 0
608+
},
609+
"type": null
610+
},
611+
{
612+
"url": "https://www.zdfheute.de/assets/nico-lange-102~1280x720?cb=1669732645738",
613+
"query_width": null,
614+
"size": {
615+
"width": 1280,
616+
"height": 0
617+
},
618+
"type": null
619+
},
620+
{
621+
"url": "https://www.zdfheute.de/assets/nico-lange-102~1920x1080?cb=1669732645738",
622+
"query_width": null,
623+
"size": {
624+
"width": 1920,
625+
"height": 0
626+
},
627+
"type": null
628+
}
629+
],
630+
"is_cover": false,
631+
"description": "Nico Lange",
632+
"caption": null,
633+
"authors": [
634+
"Tobias Koch"
635+
],
636+
"position": 465
637+
},
638+
{
639+
"versions": [
640+
{
641+
"url": "https://www.zdfheute.de/assets/jugendliche-gefangene-russland-100~384x216?cb=1725558742365",
642+
"query_width": null,
643+
"size": {
644+
"width": 384,
645+
"height": 0
646+
},
647+
"type": null
648+
}
649+
],
650+
"is_cover": false,
651+
"description": "Ein jugendlicher Gefangener steht hinter Gittern.",
652+
"caption": "Sie sind mutig: Jugendliche, die in Russland gegen den Krieg in der Ukraine protestieren, erwarten hohe Strafen. Sie dienen der Abschreckung für Nachahmer.",
653+
"authors": [],
654+
"position": 483
655+
}
656+
],
657+
"publishing_date": "2025-11-06 04:05:23.161000+01:00",
658+
"title": "Putin spricht von Versuch der Zerschlagung Russlands wegen angeblicher Dekolonisierung",
659+
"topics": [
660+
"Ukraine",
661+
"Russland",
662+
"Wladimir Putin"
663+
]
403664
}
404665
}
59.9 KB
Binary file not shown.

tests/resources/parser/test_data/de/meta.info

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,5 +294,9 @@
294294
"ZDF_2024_04_22.html.gz": {
295295
"url": "https://www.zdf.de/nachrichten/wirtschaft/deutschland-iran-handel-sanktionen-100.html",
296296
"crawl_date": "2024-04-22 17:22:43.812721"
297+
},
298+
"ZDF_2025_11_07.html.gz": {
299+
"url": "https://www.zdfheute.de/politik/ausland/putin-warnung-dekolonisierung-russland-100.html",
300+
"crawl_date": "2025-11-07 00:28:51.330920"
297301
}
298302
}

0 commit comments

Comments
 (0)