Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial support for Italian publishers, starting with La Repubblica #670

Merged
merged 12 commits into from
Jan 2, 2025
32 changes: 32 additions & 0 deletions docs/supported_publishers.md
Original file line number Diff line number Diff line change
Expand Up @@ -1125,6 +1125,38 @@
</table>


## IT-Publishers

<table class="publishers it">
<thead>
<tr>
<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>
<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>
<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>
<th>Missing&#160;Attributes</th>
<th>Additional&#160;Attributes&#160;&#160;&#160;&#160;</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<code>LaRepubblica</code>
</td>
<td>
<div>La Repubblica</div>
</td>
<td>
<a href="https://www.repubblica.it">
<span>www.repubblica.it</span>
</a>
</td>
<td>&#160;</td>
<td>&#160;</td>
</tr>
</tbody>
</table>


## JP-Publishers

<table class="publishers jp">
Expand Down
2 changes: 2 additions & 0 deletions src/fundus/publishers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from fundus.publishers.es import ES
from fundus.publishers.fr import FR
from fundus.publishers.ind import IND
from fundus.publishers.it import IT
from fundus.publishers.jp import JP
from fundus.publishers.lt import LT
from fundus.publishers.my import MY
Expand Down Expand Up @@ -69,3 +70,4 @@ class PublisherCollection(metaclass=PublisherCollectionMeta):
ca = CA
es = ES
jp = JP
it = IT
29 changes: 29 additions & 0 deletions src/fundus/publishers/it/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from datetime import datetime, timedelta

from fundus.publishers.base_objects import Publisher, PublisherGroup
from fundus.publishers.it.la_repubblica import LaRepubblicaParser
from fundus.scraping.url import RSSFeed, Sitemap

start_month = "2020-01"
# end month is the next month
end_month = (datetime.now() + timedelta(days=30)).strftime("%Y-%m")

sitemap_urls = []
# urls in the format https://www.repubblica.it/sitemap-<year>-<month>.xml
# like https://www.repubblica.it/sitemap-2000-01.xml
for year in range(int(start_month.split("-")[0]), int(end_month.split("-")[0]) + 1):
for month in range(1, 13):
# month needs to be in the format 01, 02, 03, etc.
month_str = f"{month:02d}"
sitemap_urls.append(f"https://www.repubblica.it/sitemap-{year}-{month_str}.xml")
sitemap_urls.reverse()
MaxDall marked this conversation as resolved.
Show resolved Hide resolved


class IT(metaclass=PublisherGroup):
LaRepubblica = Publisher(
name="La Repubblica",
domain="https://www.repubblica.it",
parser=LaRepubblicaParser,
sources=[Sitemap(sitemap_url, reverse=False, recursive=False) for sitemap_url in sitemap_urls]
+ [RSSFeed("https://www.repubblica.it/rss/homepage/rss2.0.xml")],
)
63 changes: 63 additions & 0 deletions src/fundus/publishers/it/la_repubblica.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
from datetime import datetime
from typing import List, Optional

from lxml.cssselect import CSSSelector
from lxml.etree import XPath

from fundus.parser import ArticleBody, BaseParser, ParserProxy, attribute
from fundus.parser.utility import (
extract_article_body_with_selector,
generic_author_parsing,
generic_date_parsing,
generic_topic_parsing,
)


class LaRepubblicaParser(ParserProxy):
class V1(BaseParser):
# Selectors for article body parts
_paragraph_selector = CSSSelector("div.story__text p")
_subheadline_selector = CSSSelector("div.story__text h2")

@attribute
def title(self) -> Optional[str]:
# Get the headline from og:title meta tag
return self.precomputed.meta.get("og:title")

@attribute
def body(self) -> Optional[ArticleBody]:
# Extract article body using utility function
return extract_article_body_with_selector(
self.precomputed.doc,
paragraph_selector=self._paragraph_selector,
subheadline_selector=self._subheadline_selector,
)

@attribute
def authors(self) -> List[str]:
# Extract authors from schema.org NewsArticle data
authors = self.precomputed.ld.xpath_search("//NewsArticle/author")
if authors:
return generic_author_parsing(authors)
return []

@attribute
def publishing_date(self) -> Optional[datetime]:
# Extract publishing date from schema.org NewsArticle data
date_str = self.precomputed.ld.xpath_search("//NewsArticle/datePublished")
return generic_date_parsing(date_str[0] if date_str else None)
MaxDall marked this conversation as resolved.
Show resolved Hide resolved

@attribute
def topics(self) -> List[str]:
# Extract topics from schema.org NewsArticle data
topics = self.precomputed.ld.xpath_search("//NewsArticle/about")
if topics:
return generic_topic_parsing([topic.get("name") for topic in topics if topic.get("name")])
return []
ruggsea marked this conversation as resolved.
Show resolved Hide resolved

@attribute
def free_access(self) -> bool:
# Check if article is freely accessible from schema.org NewsArticle data
is_free = self.precomputed.ld.xpath_search("//NewsArticle/isAccessibleForFree")
free = True if is_free[0] == "True" else False
return free
MaxDall marked this conversation as resolved.
Show resolved Hide resolved
34 changes: 34 additions & 0 deletions tests/resources/parser/test_data/it/LaRepubblica.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"V1": {
"authors": [
"Massimo Basile"
],
"body": {
"summary": [],
"sections": [
{
"headline": [],
"paragraphs": [
"New York - Un “gigante”. Un “esempio di umanità”. L’eroe, l’uomo di pace, quello la cui “post-presidenza ha avuto il più grande impatto nella storia d’America”. L’omaggio dei leader del mondo all’ex presidente degli Stati Uniti Jimmy Carter, scomparso ieri all’età di cento anni, è unito da un filo conduttore: tutti riconoscono l’umanità di un personaggio della storia che ha, alla fine degli anni ’70, ha lavorato per portare la pace, far uscire gli Stati Uniti dall’isolamento, promuovere le battaglie ambientaliste e diventato, assieme alla moglie Rosalynn, scomparsa l’anno scorso, figura universale per il suo impegno umanitario al servizio degli ultimi.",
"“Il mondo - ha dichiarato il presidente Joe Biden - ha perso uno straordinario leader e statista”. “Per sei decenni - ha aggiunto assieme alla moglie Jill - abbiamo avuto l’onore di considerare Jimmy Carter amico. Ma ciò che è stato più straordinario è che anche milioni di persone in tutta l’America e nel mondo che non lo hanno mai conosciuto pensavano a lui come a un caro amico”. “Con la sua compassione - ha sottolineato - e la chiarezza morale, ha lavorato per sradicare le malattie, forgiare la pace, promuovere i diritti civili e umani, sostenere libere e corrette elezioni, dare una casa agli homeless e ha sempre lavorato in difesa degli ultimi. Ha salvato, elevato e cambiato la vita delle persone in tutto il globo”. Il presidente Usa uscente ha ordinato funerali di Stato che si terranno a Washington D.C.",
"“Le sfide che Jimmy ha dovuto affrontare come presidente - ha ricordato su Truth Donald Trump - sono arrivate in un momento cruciale per il nostro Paese e ha fatto tutto ciò che era in suo potere per migliorare la vita di tutti gli americani. Per questo, tutti noi abbiamo un debito di gratitudine con lui\".",
"La vicepresidente Kamala Harris ne ha sottolineato la “dolcezza, saggezza e profonda grazia”. “La sua vita - ha aggiunto - e l’esempio continueranno a ispirare me e le generazioni che verranno”. L’ispirazione è un passaggio utilizzato anche dall’ex presidente George W. Bush, che ha ricordato come l’impegno della noprofit Carter Center abbia “rappresentato un esempio di servizio verso gli altri, che ispirerà gli americani per generazioni”.",
"Barack e Michelle Obama hanno definito la sua post-presidenza la “più lunga e impattante nella storia d’America”. “Tutte le volte - ha aggiunto Obama - che ho avuto la possibilità di passare del tempo con il presidente Carter, è stato chiaro come lui non professasse soltanto i suoi valori, li ha incarnati, e facendo così ha insegnato a tutti noi cosa significa vivere una vita di grazia, dignità, giustizia e al servizio degli altri”.",
"Un’altra ex coppia presidenziale, Bill e Hillary Clinton, ha espresso gratitudine “per la lunga, buona vita del presidente Carter, che ha guidato con la sua fede per servire il prossimo, davvero fino all’ultimo”. I Clinton hanno ricordato, non casualmente, tra gli obiettivi raggiunti da presidente l’impegno a “restituire a Panama il suo Canale”, che invece Trump ha rivendicato di recente. Lo stesso riferimento a Panama è stato fatto anche dal segretario di Stato Antony Blinken, nel ricordare il lavoro dell’ex presidente nel far uscire l’America dall’isolamento, quando “comprese che il destino degli americani era legato a quello dei popoli degli altri Paesi”.",
"Antonio Costa, presidente del Consiglio europeo, ha sottolineato come Carter abbia “posto i diritti umani, la dignità umana e la pace al centro della sua vita politica. La sua eredità è fonte di ispirazione”. L’ex candidata Democratica a governatrice della Georgia (dove l’ex presidente era nato e ha vissuto fino alla sua scomparsa), Stacey Adams, ha parlato di “gigante che non ha mai fatto sentire nessuno più piccolo di lui”. Anche il governatore Repubblicano Brian Kemp ha reso omaggio alla sua figura: “ha mostrato al mondo l’impatto che il nostro Stato e la sua gente hanno sul Paese”.",
"Secondo il presidente francese Emmanuel Macron “per tutta la sua vita Jimmy Carter è stato un incrollabile difensore dei diritti dei più vulnerabili e ha lottato in modo instancabile per la pace”. Il dipartimento degli Affari per i veterani terrà la bandiera a mezz’asta, il giorno dell’inaugurazione della nuova presidenza, per onorare la vita di Carter.",
"Il presidente ucraino Volodymyr Zelensky ha affermato che Jimmy Carter è stato presidente degli Stati Uniti quando l'Ucraina non era ancora indipendente, ma \"il suo cuore era saldamente al nostro fianco nella nostra continua lotta per la libertà. Apprezziamo profondamente il suo fermo impegno nei confronti della fede cristiana e dei valori democratici, nonché il suo incrollabile sostegno all'Ucraina di fronte all'aggressione immotivata della Russia\", ha affermato Zelensky su X.",
"\"Sono profondamente rattristato dalla scomparsa del 39esimo presidente degli Stati Uniti, James Earl Jimmy Carter Jr”, ha detto il segretario generale dell'Onu Antonio Guterres, commentando la scomparsa dell'ex presidente. “La leadership del presidente Carter - ha aggiunto - ha dato un significativo contributo alla pace e alla sicurezza internazionale, inclusi gli accordi storici di Camp David e il trattato Salt e quelli per il Canale di Panama\". Guterres ha ricordato anche il suo ruolo chiave nella mediazione nei conflitti, nel promuovere la democrazia e sradicare e prevenire le malattie. \"Questi e altri sforzi - ha ricordato il segretario generale dell'Onu - gli sono valsi il Premio Nobel per la pace nel 2002 e hanno aiutato a promuovere il lavoro delle Nazioni Unite\".",
"Il presidente egiziano Abdel Fattah al-Sisi ha definito l'ex presidente degli Stati Uniti Jimmy Carter \"simbolo degli sforzi umanitari\" per il suo ruolo nella mediazione degli storici accordi di Camp David del 1978, che hanno stabilito la pace tra l'Egitto e il suo più serio avversario dell'epoca, Israele.",
"\"Il suo ruolo significativo nel raggiungimento dell'accordo di pace tra Egitto e Israele rimarrà impresso negli annali della storia e il suo lavoro umanitario esemplifica un elevato standard di amore, pace e fratellanza\", ha affermato il leader egiziano in un post su X."
]
}
]
},
"publishing_date": "2024-12-30 01:26:31+00:00",
"title": "Morte Carter, le reazioni. Biden: “America e mondo perdono un grande leader”. E ordina funerali di Stato. Trump: “Debito di gratitudine”",
"topics": [
"Esteri"
]
}
}
Binary file not shown.
6 changes: 6 additions & 0 deletions tests/resources/parser/test_data/it/meta.info
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"LaRepubblica_2024_12_30.html.gz": {
"url": "https://www.repubblica.it/esteri/2024/12/30/news/morte_jimmy_carter_reazioni-423912500/",
"crawl_date": "2024-12-30 04:58:33.359818"
}
}
Loading