Skip to content

Commit 171dbbb

Browse files
authored
Merge pull request #340 from flairNLP/add_braunschweiger_zeitung
Addition of Braunschweiger Zeitung
2 parents ce6039d + 5c6f687 commit 171dbbb

File tree

6 files changed

+126
-7
lines changed

6 files changed

+126
-7
lines changed

docs/supported_publishers.md

+23-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<tr>
99
<th>Class&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
1010
<th>Source&#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>
11-
<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;</th>
11+
<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;</th>
1212
<th>Missing&#160;Attributes</th>
1313
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
1414
</tr>
@@ -42,7 +42,7 @@
4242
<tr>
4343
<th>Class&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
4444
<th>Source&#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>
45-
<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;</th>
45+
<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;</th>
4646
<th>Missing&#160;Attributes</th>
4747
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
4848
</tr>
@@ -78,6 +78,23 @@
7878
<td>&#160;</td>
7979
<td>&#160;</td>
8080
</tr>
81+
<tr>
82+
<td>
83+
<code>BSZ</code>
84+
</td>
85+
<td>
86+
<div>Braunschweiger Zeitung</div>
87+
</td>
88+
<td>
89+
<a href="https://www.braunschweiger-zeitung.de/">
90+
<span>www.braunschweiger-zeitung.de</span>
91+
</a>
92+
</td>
93+
<td>&#160;</td>
94+
<td>
95+
<code>free_access</code>
96+
</td>
97+
</tr>
8198
<tr>
8299
<td>
83100
<code>BusinessInsider</code>
@@ -331,7 +348,7 @@
331348
<tr>
332349
<th>Class&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
333350
<th>Source&#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>
334-
<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;</th>
351+
<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;</th>
335352
<th>Missing&#160;Attributes</th>
336353
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
337354
</tr>
@@ -363,7 +380,7 @@
363380
<tr>
364381
<th>Class&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
365382
<th>Source&#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>
366-
<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;</th>
383+
<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;</th>
367384
<th>Missing&#160;Attributes</th>
368385
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
369386
</tr>
@@ -397,7 +414,7 @@
397414
<tr>
398415
<th>Class&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
399416
<th>Source&#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>
400-
<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;</th>
417+
<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;</th>
401418
<th>Missing&#160;Attributes</th>
402419
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
403420
</tr>
@@ -474,7 +491,7 @@
474491
<tr>
475492
<th>Class&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</th>
476493
<th>Source&#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>
477-
<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;</th>
494+
<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;</th>
478495
<th>Missing&#160;Attributes</th>
479496
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
480497
</tr>

src/fundus/publishers/de/__init__.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
from datetime import datetime
22

3+
from dateutil.rrule import MONTHLY, rrule
4+
35
from fundus.publishers.base_objects import PublisherEnum, PublisherSpec
46
from fundus.scraping.filter import regex_filter
57
from fundus.scraping.html import NewsMap, RSSFeed, Sitemap
68

79
from .berliner_zeitung import BerlinerZeitungParser
810
from .bild import BildParser
11+
from .braunschweiger_zeitung import BSZParser
912
from .business_insider import BusinessInsiderParser
1013
from .die_welt import DieWeltParser
1114
from .die_zeit import DieZeitParser
@@ -174,7 +177,10 @@ class DE(PublisherEnum):
174177
Taz = PublisherSpec(
175178
name="Die Tageszeitung (taz)",
176179
domain="https://www.taz.de/",
177-
sources=[NewsMap("https://taz.de/sitemap-google-news.xml"), Sitemap("https://taz.de/sitemap-index.xml")],
180+
sources=[
181+
NewsMap("https://taz.de/sitemap-google-news.xml"),
182+
Sitemap("https://taz.de/sitemap-index.xml"),
183+
],
178184
parser=TazParser,
179185
)
180186

@@ -196,6 +202,22 @@ class DE(PublisherEnum):
196202
parser=WAZParser,
197203
)
198204

205+
BSZ = PublisherSpec(
206+
name="Braunschweiger Zeitung",
207+
domain="https://www.braunschweiger-zeitung.de/",
208+
sources=[
209+
RSSFeed("https://www.braunschweiger-zeitung.de/rss"),
210+
NewsMap("https://www.braunschweiger-zeitung.de/sitemaps/news.xml"),
211+
]
212+
+ [
213+
Sitemap(
214+
f"https://www.braunschweiger-zeitung.de/sitemaps/archive/sitemap-{d.year}-{str(d.month).zfill(2)}-p00.xml.gz"
215+
)
216+
for d in reversed(list(rrule(MONTHLY, dtstart=datetime(2016, 9, 1), until=datetime.now())))
217+
],
218+
parser=BSZParser,
219+
)
220+
199221
BusinessInsider = PublisherSpec(
200222
name="Business Insider",
201223
domain="https://www.businessinsider.de/",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import datetime
2+
import re
3+
from typing import List, Optional, Pattern
4+
5+
from lxml.etree import XPath
6+
7+
from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute
8+
from fundus.parser.utility import (
9+
apply_substitution_pattern_over_list,
10+
extract_article_body_with_selector,
11+
generic_author_parsing,
12+
generic_date_parsing,
13+
generic_topic_parsing,
14+
)
15+
16+
17+
class BSZParser(ParserProxy):
18+
class V1(BaseParser):
19+
_author_substitution_pattern: Pattern[str] = re.compile(r"FUNKE Mediengruppe")
20+
_paragraph_selector = XPath(
21+
"//div[@class='article-body']//p[not(not(text()) or @rel='author' or em[@class='print'] or contains(@class, 'font-sans'))]"
22+
)
23+
_summary_selector = XPath("//div[@class='article-body']//p[contains(@class, 'font-sans')]")
24+
_subheadline_selector = XPath(
25+
"//div[@class='article-body']//h3[not("
26+
"contains(text(), 'Alle Artikel der Serie')"
27+
" or contains(text(), 'Mehr zum Thema')"
28+
" or contains(text(), 'weitere Videos')"
29+
" or contains(text(), 'Auch interessant')"
30+
" or contains(text(), 'Weitere News'))]"
31+
)
32+
33+
@attribute
34+
def body(self) -> ArticleBody:
35+
return extract_article_body_with_selector(
36+
self.precomputed.doc,
37+
summary_selector=self._summary_selector,
38+
subheadline_selector=self._subheadline_selector,
39+
paragraph_selector=self._paragraph_selector,
40+
)
41+
42+
@attribute
43+
def title(self) -> Optional[str]:
44+
return self.precomputed.ld.bf_search("headline")
45+
46+
@attribute
47+
def topics(self) -> List[str]:
48+
return generic_topic_parsing(self.precomputed.meta.get("news_keywords"))
49+
50+
@attribute
51+
def authors(self) -> List[str]:
52+
return apply_substitution_pattern_over_list(
53+
generic_author_parsing(self.precomputed.ld.bf_search("author")), self._author_substitution_pattern
54+
)
55+
56+
@attribute
57+
def publishing_date(self) -> Optional[datetime.datetime]:
58+
return generic_date_parsing(self.precomputed.ld.bf_search("datePublished"))
59+
60+
@attribute(validate=False)
61+
def free_access(self) -> bool:
62+
return self.precomputed.ld.bf_search("isAccessibleForFree") == "True"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"V1": {
3+
"authors": [
4+
"Stefan Lienert"
5+
],
6+
"publishing_date": "2024-01-29 18:09:51+00:00",
7+
"title": "Heide-Park: Eröffnungstermin für neue Attraktion steht fest",
8+
"topics": [
9+
"Freizeitpark",
10+
"Soltau",
11+
"Heide-Park Soltau"
12+
]
13+
}
14+
}
Binary file not shown.

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

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
{
2+
"BSZ_2024_01_29.html.gz": {
3+
"url": "https://www.braunschweiger-zeitung.de/niedersachsen/article241536118/Heide-Park-Eroeffnungstermin-fuer-neue-Attraktion-steht-fest.html",
4+
"crawl_date": "2024-01-29 19:29:19.952428"
5+
},
26
"BerlinerZeitung_2023_04_28.html.gz": {
37
"url": "https://www.berliner-zeitung.de/news/550-kinder-gezeugt-gericht-stoppt-uebereifrigen-samenspender-in-den-niederlanden-li.343191",
48
"crawl_date": "2023-04-28 20:25:16.328923"

0 commit comments

Comments
 (0)