Skip to content

Commit babf123

Browse files
authored
Merge pull request #697 from flairNLP/add-se
Add `BE`
2 parents 30937d8 + 72e4f7b commit babf123

File tree

7 files changed

+372
-0
lines changed

7 files changed

+372
-0
lines changed

docs/supported_publishers.md

+32
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,38 @@
101101
</table>
102102

103103

104+
## BE-Publishers
105+
106+
<table class="publishers be">
107+
<thead>
108+
<tr>
109+
<th>Class&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
110+
<th>Name&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
111+
<th>URL&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
112+
<th>Missing&#160;Attributes</th>
113+
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
114+
</tr>
115+
</thead>
116+
<tbody>
117+
<tr>
118+
<td>
119+
<code>Nieuwsblad</code>
120+
</td>
121+
<td>
122+
<div>Nieuwsblad</div>
123+
</td>
124+
<td>
125+
<a href="https://www.nieuwsblad.be/">
126+
<span>www.nieuwsblad.be</span>
127+
</a>
128+
</td>
129+
<td>&#160;</td>
130+
<td>&#160;</td>
131+
</tr>
132+
</tbody>
133+
</table>
134+
135+
104136
## CA-Publishers
105137

106138
<table class="publishers ca">

src/fundus/publishers/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from fundus.publishers.at import AT
55
from fundus.publishers.au import AU
66
from fundus.publishers.base_objects import Publisher, PublisherGroup
7+
from fundus.publishers.be import BE
78
from fundus.publishers.ca import CA
89
from fundus.publishers.ch import CH
910
from fundus.publishers.cn import CN
@@ -66,6 +67,7 @@ class PublisherCollection(metaclass=PublisherCollectionMeta):
6667
ch = CH
6768
lt = LT
6869
cn = CN
70+
be = BE
6971
tr = TR
7072
my = MY
7173
ind = IND

src/fundus/publishers/be/__init__.py

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from fundus.publishers.base_objects import Publisher, PublisherGroup
2+
from fundus.publishers.be.nieuwsblad import NieuwsbladParser
3+
from fundus.scraping.url import RSSFeed, Sitemap
4+
5+
6+
class BE(metaclass=PublisherGroup):
7+
Nieuwsblad = Publisher(
8+
name="Nieuwsblad",
9+
domain="https://www.nieuwsblad.be/",
10+
parser=NieuwsbladParser,
11+
sources=[
12+
RSSFeed("https://www.nieuwsblad.be/rss/section/55178e67-15a8-4ddd-a3d8-bfe5708f8932"),
13+
RSSFeed("https://www.nieuwsblad.be/rss/section/7f1bc231-66e7-49f0-a126-b7346eb3e2fa"),
14+
RSSFeed("https://www.nieuwsblad.be/rss/section/3dfcee99-2971-4c4c-a603-8c41ae86398b"),
15+
RSSFeed("https://www.nieuwsblad.be/rss/section/c0c3b215-10be-4f82-86d6-8b8584a5639d"),
16+
],
17+
)
+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import datetime
2+
import re
3+
from typing import List, Optional
4+
5+
from lxml.etree import XPath
6+
7+
from fundus.parser import ArticleBody, BaseParser, Image, ParserProxy, attribute
8+
from fundus.parser.utility import (
9+
extract_article_body_with_selector,
10+
generic_author_parsing,
11+
generic_date_parsing,
12+
generic_topic_parsing,
13+
image_extraction,
14+
strip_nodes_to_text,
15+
)
16+
17+
18+
class NieuwsbladParser(ParserProxy):
19+
class V1(BaseParser):
20+
_summary_selector = XPath("//div[@data-testid='article-intro']")
21+
_paragraph_selector = XPath("//div[@data-testid='article-body']/p[text()]")
22+
_subheadline_selector = XPath(
23+
"//div[@data-testid='article-body']/p/span[@class='bold'] | " "//div[@data-testid='article-body']/h3"
24+
)
25+
26+
_topic_selector = XPath("//ul[contains(@class, 'taglist')]/li")
27+
28+
@attribute
29+
def body(self) -> Optional[ArticleBody]:
30+
return extract_article_body_with_selector(
31+
self.precomputed.doc,
32+
paragraph_selector=self._paragraph_selector,
33+
subheadline_selector=self._subheadline_selector,
34+
summary_selector=self._summary_selector,
35+
)
36+
37+
@attribute
38+
def authors(self) -> List[str]:
39+
return generic_author_parsing(self.precomputed.ld.bf_search("author"))
40+
41+
@attribute
42+
def publishing_date(self) -> Optional[datetime.datetime]:
43+
return generic_date_parsing(self.precomputed.ld.bf_search("datePublished"))
44+
45+
@attribute
46+
def title(self) -> Optional[str]:
47+
return self.precomputed.ld.bf_search("headline")
48+
49+
@attribute
50+
def topics(self) -> List[str]:
51+
topic_string = strip_nodes_to_text(self._topic_selector(self.precomputed.doc), join_on=",")
52+
if topic_string is not None:
53+
return generic_topic_parsing(topic_string, delimiter=",")
54+
return []
55+
56+
@attribute
57+
def images(self) -> List[Image]:
58+
return image_extraction(
59+
doc=self.precomputed.doc,
60+
paragraph_selector=self._paragraph_selector,
61+
author_selector=re.compile(r"\s*—?\s*©\s*(?P<credits>.*)"),
62+
lower_boundary_selector=XPath("//div[@class='widget partnerbox_1']"),
63+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
{
2+
"V1": {
3+
"authors": [
4+
"nieuwsblad.be"
5+
],
6+
"body": {
7+
"summary": [
8+
"Annelies Verlinden (46) maakt voor CD&V opnieuw haar opwachting in de federale regering, dit keer als minister van Justitie. De ex-zakenadvocate werd Vivaldi binnengeloodst door toenmalig partijvoorzitter Joachim Coens en groeide na een goed persoonlijk resultaat op 9 juni 2024 uit tot een sterkhouder voor de christendemocraten."
9+
],
10+
"sections": [
11+
{
12+
"headline": [],
13+
"paragraphs": [
14+
"Annelies Verlinden wordt in 1978 geboren in het Antwerpse Merksem en studeert in 2001 af van de KULeuven met een master in de rechten. Daarna haalt ze nog een diploma Europees recht aan de UCL.",
15+
"Na haar studies gaat ze aan de slag bij het internationale advocatenkantoor DLA Piper. In 2014 wordt ze er vennoot. Verlinden heeft een expertise in administratief recht, milieurecht en publiek recht. Ze treedt onder meer op als advocate in de Arco-rechtszaak bij de Raad van State.",
16+
"In oktober 2020 tovert CD&V-voorzitter Joachim Coens haar uit de hoed als minister van Binnenlandse Zaken en Institutionele Hervormingen en Democratische Vernieuwing. Een grote verrassing in de Wetstraat, al is haar politieke engagement niet nieuw. Verlinden is tussen 2005 en 2009 al ondervoorzitter van Jong CD&V en is in haar thuisbasis Schoten tussen 2003 en 2012 gemeenteraadslid."
17+
]
18+
},
19+
{
20+
"headline": [
21+
"Coronapandemie"
22+
],
23+
"paragraphs": [
24+
"Begin vorig jaar onthult ze in haar boek Eerlijk gezegd dat Joachim Coens al jaren een belangrijke rol speelt in haar politiek engagement. Ze leerden elkaar kennen toen zij hem als rechtenstudent interviewde voor een paper en hielden sindsdien contact. In 2020 consulteerde Coens haar geregeld tijdens de regeringsonderhandelingen en vroeg hij haar uiteindelijk om minister te worden. De beslissing nam ze naar eigen zeggen “in vijf minuten”.",
25+
"Verlinden wordt de eerste jaren net als de andere Vivaldi-ministers volledig opgeslokt door de coronapandemie. Als minister van Binnenlandse Zaken is ze verantwoordelijk voor de ministeriële besluiten met coronaregels die na afloop van elk Overlegcomité moeten worden opgesteld. Dat werk mondt uiteindelijk uit in een pandemiewet, die de politiek een stevigere juridische basis biedt voor de verregaande maatregelen."
26+
]
27+
},
28+
{
29+
"headline": [
30+
"Overstromingen"
31+
],
32+
"paragraphs": [
33+
"Ook naast de coronapandemie blijft Verlinden niet gespaard van crisissen. De overstromingen in Wallonië in de zomer van 2021 grijpen haar zwaar aan, net als de moord op de Brusselse agent Thomas Monjoie en de aanslag op Zweedse voetbalsupporters in oktober 2023. (Tekst gaat verder onder de foto.)",
34+
"Vivaldi houdt er gedurende de legislatuur een gespannen relatie met de politievakbonden op na. Verlinden zorgt er wel voor dat agenten voor het eerst in 20 jaar een loonsverhoging bovenop de index krijgen, maar die moet na overleg in de regering over meerdere jaren worden gespreid, tot onvrede van de bonden. Dat er een uitdoofscenario voor de voordelige pensioenregeling voor politieagenten (NAVAP) aan gekoppeld wordt, wordt evenmin op applaus onthaald.",
35+
"Samen met MR-vicepremier David Clarinval is Verlinden bevoegd voor de voorbereiding van de institutionele toekomst van het land, maar de brede volksbevraging die het tweetal lanceert draait uit op een sisser."
36+
]
37+
},
38+
{
39+
"headline": [
40+
"Chatbot"
41+
],
42+
"paragraphs": [
43+
"Met de pers heeft de CD&V-politica het moeilijk, geeft ze zelf aan in Eerlijk gezegd. Ze wordt afgeschilderd als “ijskoningin of “chatbot”, beelden waarin ze zich helemaal niet herkent. Om die reden gaat ze spaarzaam om met details over haar privéleven en probeert ze beheerst te communiceren, zonder polariserend taalgebruik. “Ik voel geen behoefte om populair te doen”, zegt ze daar zelf over.",
44+
"Die houding levert haar electoraal geen windeieren op. In juni 2024 trekt Verlinden de Kamerlijst voor CD&V in Antwerpen, een moeilijke provincie voor de christendemocraten. Maar de minister haalt er meer dan 65.000 voorkeurstemmen, het op vier na sterkste resultaat nationaal. Haar status in de partij vaart er wel bij, en Verlinden staat voor CD&V op het voorplan tijdens de federale regeringsonderhandelingen. Dat ze net als vicepremier Vincent Van Peteghem in Arizona opnieuw een rol zou spelen, is dus geen grote verrassing."
45+
]
46+
}
47+
]
48+
},
49+
"images": [
50+
{
51+
"versions": [
52+
{
53+
"url": "https://img.nieuwsblad.be/RNzXDeKWDb7yW-vhpgeCexODVdI=/120x80/smart/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2F9c36b38b-2b0b-4738-a73c-f9bc53802d8a.jpg",
54+
"query_width": null,
55+
"size": {
56+
"width": 120,
57+
"height": 0
58+
},
59+
"type": "image/jpeg"
60+
},
61+
{
62+
"url": "https://img.nieuwsblad.be/e8q79eW964LYHhAx5Olld4b7hj8=/160x107/smart/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2F9c36b38b-2b0b-4738-a73c-f9bc53802d8a.jpg",
63+
"query_width": null,
64+
"size": {
65+
"width": 160,
66+
"height": 0
67+
},
68+
"type": "image/jpeg"
69+
},
70+
{
71+
"url": "https://img.nieuwsblad.be/ZiPOlKsdjOaIS9tILwNsjdNfhm4=/320x213/smart/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2F9c36b38b-2b0b-4738-a73c-f9bc53802d8a.jpg",
72+
"query_width": null,
73+
"size": {
74+
"width": 320,
75+
"height": 0
76+
},
77+
"type": "image/jpeg"
78+
},
79+
{
80+
"url": "https://img.nieuwsblad.be/SAlfS1wSy7jPzE9ldorNA6_f-7o=/640x427/smart/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2F9c36b38b-2b0b-4738-a73c-f9bc53802d8a.jpg",
81+
"query_width": null,
82+
"size": {
83+
"width": 640,
84+
"height": 0
85+
},
86+
"type": "image/jpeg"
87+
},
88+
{
89+
"url": "https://img.nieuwsblad.be/LW6KV9O1fhZ-GpU6a7unxVmih4I=/960x640/smart/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2F9c36b38b-2b0b-4738-a73c-f9bc53802d8a.jpg",
90+
"query_width": null,
91+
"size": {
92+
"width": 960,
93+
"height": 0
94+
},
95+
"type": "image/jpeg"
96+
},
97+
{
98+
"url": "https://img.nieuwsblad.be/G3jq-9FCKs1FA03rjBaiffCgA9s=/1280x853/smart/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2F9c36b38b-2b0b-4738-a73c-f9bc53802d8a.jpg",
99+
"query_width": null,
100+
"size": {
101+
"width": 1280,
102+
"height": 0
103+
},
104+
"type": "image/jpeg"
105+
}
106+
],
107+
"is_cover": true,
108+
"description": null,
109+
"caption": null,
110+
"authors": [
111+
"BART DEWAELE"
112+
],
113+
"position": 1725
114+
},
115+
{
116+
"versions": [
117+
{
118+
"url": "https://img.nieuwsblad.be/tQtQyQc2RV3ZmlDThNU4ZGbZV3c=/fit-in/120x80/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fea5be229-5670-428f-a8df-6bd2ff23870f.jpg",
119+
"query_width": null,
120+
"size": {
121+
"width": 120,
122+
"height": 0
123+
},
124+
"type": "image/jpeg"
125+
},
126+
{
127+
"url": "https://img.nieuwsblad.be/kLiUYeLuCxjkUzdOdClVl7dmQZo=/fit-in/160x107/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fea5be229-5670-428f-a8df-6bd2ff23870f.jpg",
128+
"query_width": null,
129+
"size": {
130+
"width": 160,
131+
"height": 0
132+
},
133+
"type": "image/jpeg"
134+
},
135+
{
136+
"url": "https://img.nieuwsblad.be/E_sDEyXStA2Ly0BrBM_RbeEF2Uo=/fit-in/320x213/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fea5be229-5670-428f-a8df-6bd2ff23870f.jpg",
137+
"query_width": null,
138+
"size": {
139+
"width": 320,
140+
"height": 0
141+
},
142+
"type": "image/jpeg"
143+
},
144+
{
145+
"url": "https://img.nieuwsblad.be/boIa2QBP6bmWMSX_B4YzPpstYbs=/fit-in/640x427/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fea5be229-5670-428f-a8df-6bd2ff23870f.jpg",
146+
"query_width": null,
147+
"size": {
148+
"width": 640,
149+
"height": 0
150+
},
151+
"type": "image/jpeg"
152+
},
153+
{
154+
"url": "https://img.nieuwsblad.be/spZI5HATI1of-_VLGMmTGaEH3so=/fit-in/960x640/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fea5be229-5670-428f-a8df-6bd2ff23870f.jpg",
155+
"query_width": null,
156+
"size": {
157+
"width": 960,
158+
"height": 0
159+
},
160+
"type": "image/jpeg"
161+
},
162+
{
163+
"url": "https://img.nieuwsblad.be/rrV7t3Jf-3UnbiLfH_eSt-mRYWY=/fit-in/1280x853/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fea5be229-5670-428f-a8df-6bd2ff23870f.jpg",
164+
"query_width": null,
165+
"size": {
166+
"width": 1280,
167+
"height": 0
168+
},
169+
"type": "image/jpeg"
170+
}
171+
],
172+
"is_cover": false,
173+
"description": "Verlinden tijdens de coronacrisis.",
174+
"caption": "Verlinden tijdens de coronacrisis.",
175+
"authors": [
176+
"BELGA"
177+
],
178+
"position": 1769
179+
},
180+
{
181+
"versions": [
182+
{
183+
"url": "https://img.nieuwsblad.be/1GHF6TvniEdPP504KVGyPxPuOe4=/fit-in/120x80/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fa0b254d3-e314-4b05-a29f-d1f35d50ebf7.jpg",
184+
"query_width": null,
185+
"size": {
186+
"width": 120,
187+
"height": 0
188+
},
189+
"type": "image/jpeg"
190+
},
191+
{
192+
"url": "https://img.nieuwsblad.be/lI1xY0yCSMHbXaSWYUFnUAwJFVM=/fit-in/160x107/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fa0b254d3-e314-4b05-a29f-d1f35d50ebf7.jpg",
193+
"query_width": null,
194+
"size": {
195+
"width": 160,
196+
"height": 0
197+
},
198+
"type": "image/jpeg"
199+
},
200+
{
201+
"url": "https://img.nieuwsblad.be/APU3Kcr7FL5sP9i6rsOTRaqRGlE=/fit-in/320x213/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fa0b254d3-e314-4b05-a29f-d1f35d50ebf7.jpg",
202+
"query_width": null,
203+
"size": {
204+
"width": 320,
205+
"height": 0
206+
},
207+
"type": "image/jpeg"
208+
},
209+
{
210+
"url": "https://img.nieuwsblad.be/x9bUGCUqFJ1L1eshPXYlTCV2x2w=/fit-in/640x427/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fa0b254d3-e314-4b05-a29f-d1f35d50ebf7.jpg",
211+
"query_width": null,
212+
"size": {
213+
"width": 640,
214+
"height": 0
215+
},
216+
"type": "image/jpeg"
217+
},
218+
{
219+
"url": "https://img.nieuwsblad.be/u6uoXuNK2Uxx3CAnjLRuoPwxsqM=/fit-in/960x640/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fa0b254d3-e314-4b05-a29f-d1f35d50ebf7.jpg",
220+
"query_width": null,
221+
"size": {
222+
"width": 960,
223+
"height": 0
224+
},
225+
"type": "image/jpeg"
226+
},
227+
{
228+
"url": "https://img.nieuwsblad.be/EqxuDrxfr_sQ3PofZpLC8YfgKcM=/fit-in/1280x853/https%3A%2F%2Fstatic.nieuwsblad.be%2FAssets%2FImages_Upload%2F2025%2F02%2F02%2Fa0b254d3-e314-4b05-a29f-d1f35d50ebf7.jpg",
229+
"query_width": null,
230+
"size": {
231+
"width": 1280,
232+
"height": 0
233+
},
234+
"type": "image/jpeg"
235+
}
236+
],
237+
"is_cover": false,
238+
"description": "Tijdens een herdenking voor de slachtoffers van de waterbom van juli 2021 in de provincie Luik.",
239+
"caption": "Tijdens een herdenking voor de slachtoffers van de waterbom van juli 2021 in de provincie Luik.",
240+
"authors": [
241+
"BELGA"
242+
],
243+
"position": 1784
244+
}
245+
],
246+
"publishing_date": "2025-02-02 20:07:46+01:00",
247+
"title": "BIO. Annelies Verlinden ruilt Binnenlandse Zaken in voor Justitie",
248+
"topics": [
249+
"Annelies Verlinden"
250+
]
251+
}
252+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"Nieuwsblad_2025_02_02.html.gz": {
3+
"url": "https://www.nieuwsblad.be/cnt/dmf20250202_96887132",
4+
"crawl_date": "2025-02-02 23:02:23.326767"
5+
}
6+
}

0 commit comments

Comments
 (0)