Skip to content

Commit 9ffac51

Browse files
authored
Merge pull request #800 from ghostsshadow/se-expressen
Add SE Expressen
2 parents 8fec28d + 47063ec commit 9ffac51

File tree

7 files changed

+210
-0
lines changed

7 files changed

+210
-0
lines changed

docs/supported_publishers.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2766,6 +2766,44 @@
27662766
</table>
27672767

27682768

2769+
## SE-Publishers
2770+
2771+
<table class="publishers se">
2772+
<thead>
2773+
<tr>
2774+
<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>
2775+
<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>
2776+
<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>
2777+
<th>Languages</th>
2778+
<th>Missing&#160;Attributes</th>
2779+
<th>Deprecated&#160;Attributes</th>
2780+
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
2781+
</tr>
2782+
</thead>
2783+
<tbody>
2784+
<tr>
2785+
<td>
2786+
<code>Expressen</code>
2787+
</td>
2788+
<td>
2789+
<div>Expressen</div>
2790+
</td>
2791+
<td>
2792+
<a href="https://www.expressen.se/">
2793+
<span>www.expressen.se</span>
2794+
</a>
2795+
</td>
2796+
<td>
2797+
<code>sv</code>
2798+
</td>
2799+
<td>&#160;</td>
2800+
<td>&#160;</td>
2801+
<td>&#160;</td>
2802+
</tr>
2803+
</tbody>
2804+
</table>
2805+
2806+
27692807
## TR-Publishers
27702808

27712809
<table class="publishers tr">

src/fundus/publishers/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
from fundus.publishers.pt import PT
3333
from fundus.publishers.py import PY
3434
from fundus.publishers.ru import RU
35+
from fundus.publishers.se import SE
3536
from fundus.publishers.tr import TR
3637
from fundus.publishers.tw import TW
3738
from fundus.publishers.tz import TZ
@@ -101,6 +102,7 @@ class PublisherCollection(metaclass=PublisherCollectionMeta):
101102
pt = PT
102103
py = PY
103104
ru = RU
105+
se = SE
104106
tr = TR
105107
tw = TW
106108
tz = TZ
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from fundus.publishers.base_objects import Publisher, PublisherGroup
2+
from fundus.scraping.filter import regex_filter
3+
from fundus.scraping.url import NewsMap, RSSFeed, Sitemap
4+
5+
from .expressen import ExpressenParser
6+
7+
8+
class SE(metaclass=PublisherGroup):
9+
default_language = "sv"
10+
11+
Expressen = Publisher(
12+
name="Expressen",
13+
domain="https://www.expressen.se/",
14+
parser=ExpressenParser,
15+
sources=[
16+
RSSFeed("https://feeds.expressen.se/nyheter/"),
17+
RSSFeed("https://feeds.expressen.se/gt"),
18+
RSSFeed("https://feeds.expressen.se/kvp/"),
19+
RSSFeed("https://feeds.expressen.se/sport/"),
20+
RSSFeed("https://feeds.expressen.se/fotboll/"),
21+
RSSFeed("https://feeds.expressen.se/hockey/"),
22+
RSSFeed("https://feeds.expressen.se/noje/"),
23+
RSSFeed("https://feeds.expressen.se/debatt/"),
24+
RSSFeed("https://feeds.expressen.se/ledare/"),
25+
RSSFeed("https://feeds.expressen.se/kultur/"),
26+
RSSFeed("https://feeds.expressen.se/dinapengar/"),
27+
RSSFeed("https://feeds.expressen.se/halsoliv/"),
28+
RSSFeed("https://feeds.expressen.se/levabo/"),
29+
RSSFeed("https://feeds.expressen.se/motor/"),
30+
RSSFeed("https://feeds.expressen.se/allt-om-resor/"),
31+
Sitemap("https://www.expressen.se/sitemap.xml", reverse=True),
32+
],
33+
url_filter=regex_filter(r"/tv/|expressen-direkt"),
34+
)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import datetime
2+
from typing import List, Optional
3+
4+
from lxml.cssselect import CSSSelector
5+
from lxml.etree import XPath
6+
7+
from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute
8+
from fundus.parser.data import Image
9+
from fundus.parser.utility import (
10+
extract_article_body_with_selector,
11+
generic_author_parsing,
12+
generic_date_parsing,
13+
generic_topic_parsing,
14+
image_extraction,
15+
)
16+
17+
18+
class ExpressenParser(ParserProxy):
19+
class V1(BaseParser):
20+
_paragraph_selector = CSSSelector("div.article__body-text p")
21+
_summary_selector = CSSSelector("div.article__preamble")
22+
_subheadline_selector = CSSSelector("div.article__body-text h2")
23+
24+
@attribute
25+
def body(self) -> Optional[ArticleBody]:
26+
return extract_article_body_with_selector(
27+
self.precomputed.doc,
28+
paragraph_selector=self._paragraph_selector,
29+
summary_selector=self._summary_selector,
30+
subheadline_selector=self._subheadline_selector,
31+
)
32+
33+
@attribute
34+
def title(self) -> Optional[str]:
35+
return self.precomputed.ld.bf_search("headline")
36+
37+
@attribute
38+
def publishing_date(self) -> Optional[datetime.datetime]:
39+
return generic_date_parsing(self.precomputed.ld.bf_search("datePublished"))
40+
41+
@attribute
42+
def authors(self) -> List[str]:
43+
return generic_author_parsing(self.precomputed.ld.bf_search("author"))
44+
45+
@attribute
46+
def images(self) -> List[Image]:
47+
return image_extraction(
48+
doc=self.precomputed.doc,
49+
paragraph_selector=self._paragraph_selector,
50+
image_selector=XPath("//figure//img"),
51+
caption_selector=XPath("./ancestor::figure//figcaption//div[@class='rich-image__description']"),
52+
author_selector=XPath("./ancestor::figure//figcaption//div[@class='rich-image__credit']"),
53+
upper_boundary_selector=CSSSelector("div.article__body-text"),
54+
)
55+
56+
@attribute
57+
def topics(self) -> List[str]:
58+
return [topic.split("/")[-1] for topic in generic_topic_parsing(self.precomputed.ld.bf_search("keywords"))]
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{
2+
"V1": {
3+
"authors": [
4+
"viktor hedlund"
5+
],
6+
"body": {
7+
"summary": [
8+
"Eleverna på privatskolan Lundsberg trängde på natten in och misshandlade flera andra elever, enligt åtalet.I sovrummen slog de skolkamraterna med skärp.Nu åtalas fem elever för misshandel och grovt hemfridsbrott."
9+
],
10+
"sections": [
11+
{
12+
"headline": [],
13+
"paragraphs": [
14+
"De fem manliga eleverna i 18-årsåldern på internatskolan i värmländska Storfors misstänks för att vid flera tillfällen i vintras ha misshandlat andra elever på skolan.",
15+
"I januari ska två av eleverna delat ut slag mot andra elever på ett elevhem samt i nära anslutning till middagen på Lundsberg.",
16+
"Senare på natten stormade de fem åtalade in i två sovrum på ett elevhem, enligt åtalet. De var maskerade och började slå flera personer med nävar och skärp. En person kastades ner i golvet innan han blev misshandlad.",
17+
"”Brottet bör bedömas som grovt eftersom inträngandet skett nattetid av flera maskerade gärningsmän i syfte att misshandla målsägandena”, står det i åtalet."
18+
]
19+
},
20+
{
21+
"headline": [
22+
"Fem elever stängdes av"
23+
],
24+
"paragraphs": [
25+
"En av de misstänkta åtalas också för att redan hösten 2024 tillsammans med flera andra trängt in i ett sovrum och misshandlat en elev. Han ska också ha filmat misshandeln och spridit det till andra elever.",
26+
"I en av de misstänktas telefon har polisen hittat en konversation som enligt åklagaren visar på att motivet varit att ”'dom' har förolämpat 'oss' under en längre tid”.",
27+
"I januari briserade nyheten om ”en allvarlig incident” på Lundsberg som ledde till att fem personer stängdes av. Expressen kunde då berätta att det hållits någon form av uppträdande som gick ut på att göra narr varandra och där de yngre eleverna ska ha drivit hårt med de äldres föräldrar.",
28+
"Eleverna förnekar brott. Totalt är fem andra elever målsägande i åtalet."
29+
]
30+
}
31+
]
32+
},
33+
"images": [
34+
{
35+
"versions": [
36+
{
37+
"url": "https://static.bonniernews.se/images/44/15/44152f97b643491cb91f2aeeac1e25f5/16x9/[email protected]",
38+
"query_width": null,
39+
"size": {
40+
"width": 640,
41+
"height": 0
42+
},
43+
"type": "image/jpeg"
44+
},
45+
{
46+
"url": "https://static.bonniernews.se/images/44/15/44152f97b643491cb91f2aeeac1e25f5/16x9/[email protected]",
47+
"query_width": null,
48+
"size": {
49+
"width": 1280,
50+
"height": 0
51+
},
52+
"type": "image/jpeg"
53+
}
54+
],
55+
"is_cover": true,
56+
"description": null,
57+
"caption": "Internatskolan Lundsberg.",
58+
"authors": [
59+
"LISA MATTISSON"
60+
],
61+
"position": 907
62+
}
63+
],
64+
"publishing_date": "2025-10-23 08:23:39.074000+00:00",
65+
"title": "Elever åtalas för misshandel på Lundsberg",
66+
"topics": [
67+
"sverige",
68+
"lundsberg",
69+
"misshandel & överfall"
70+
]
71+
}
72+
}
48.1 KB
Binary file not shown.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"Expressen_2025_10_23.html.gz": {
3+
"url": "https://www.expressen.se/nyheter/sverige/elever-atalas-for-misshandel-pa-lundsberg/",
4+
"crawl_date": "2025-10-23 19:40:42.788082"
5+
}
6+
}

0 commit comments

Comments
 (0)