@@ -0,0 +1,53 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from time import mktime
|
||||
|
||||
import feedparser
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from .base import ExtractedJob, ExtractionResult, FieldEvidence
|
||||
|
||||
|
||||
class RssAdapter:
|
||||
parser_key = "rss-atom"
|
||||
parser_version = "1.0.0"
|
||||
|
||||
def extract(self, content: str, *, url: str) -> ExtractionResult:
|
||||
feed = feedparser.parse(content)
|
||||
jobs: list[ExtractedJob] = []
|
||||
for entry in feed.entries:
|
||||
title = str(entry.get("title") or "").strip()
|
||||
link = str(entry.get("link") or "").strip()
|
||||
if not title or not link:
|
||||
continue
|
||||
summary = str(entry.get("summary") or entry.get("description") or "")
|
||||
text = BeautifulSoup(summary, "lxml").get_text("\n", strip=True)
|
||||
published = ""
|
||||
if entry.get("published_parsed"):
|
||||
published = datetime.fromtimestamp(mktime(entry.published_parsed)).isoformat()
|
||||
jobs.append(
|
||||
ExtractedJob(
|
||||
url=link,
|
||||
title=title,
|
||||
external_id=str(entry.get("id") or ""),
|
||||
description_html=summary,
|
||||
description_text=text,
|
||||
date_posted=published,
|
||||
raw=dict(entry),
|
||||
evidence=[
|
||||
FieldEvidence("title", "rss", 0.88, title[:240]),
|
||||
FieldEvidence("description", "rss", 0.80, text[:300]),
|
||||
],
|
||||
)
|
||||
)
|
||||
warnings: list[str] = []
|
||||
if getattr(feed, "bozo", False):
|
||||
warnings.append(str(getattr(feed, "bozo_exception", "Ongeldige feed")))
|
||||
return ExtractionResult(
|
||||
jobs,
|
||||
self.parser_key,
|
||||
self.parser_version,
|
||||
0.82 if jobs else 0.0,
|
||||
warnings,
|
||||
)
|
||||
Reference in New Issue
Block a user