feat(scraper): F3 — extractor RSS + detección de feeds con word-boundary
Build & Deploy ResearchOwl / build-and-push (push) Successful in 7s
Build & Deploy ResearchOwl / build-and-push (push) Successful in 7s
detect_source_type ya clasificaba 'rss' pero no había rama en _process_source: los feeds caían a _extract_web y trafilatura no saca nada del XML (se descartaban por cortos). Ahora _extract_rss parsea el feed (feedparser en hilo, como el monitor de noticias) y siembra sus entries como fuentes nuevas: filtro de relevancia por título/URL, blacklist, dedupe, cap de 20 y respeto de max_depth. El feed en sí se marca skipped — es puro descubrimiento, no tiene contenido que trocear. De paso, la detección pasa de substring puro (clasificaba /feedback y /atomic como rss) a RSS_RE con límites de palabra. Tests de ambos. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
9dae61fde8
commit
f210b34e5f
@@ -11,6 +11,16 @@ def test_detect_source_type():
|
||||
assert detect_source_type("https://example.com/article") == "web"
|
||||
|
||||
|
||||
def test_detect_source_type_rss():
|
||||
assert detect_source_type("https://thedebrief.org/feed/") == "rss"
|
||||
assert detect_source_type("https://example.com/rss") == "rss"
|
||||
assert detect_source_type("https://example.com/feeds/all.atom.xml") == "rss"
|
||||
assert detect_source_type("https://www.liberationtimes.com/?format=rss") == "rss"
|
||||
# Falsos positivos del substring viejo: no son feeds.
|
||||
assert detect_source_type("https://example.com/feedback") == "web"
|
||||
assert detect_source_type("https://example.com/atomic-theory") == "web"
|
||||
|
||||
|
||||
def test_is_blacklisted():
|
||||
assert is_blacklisted("https://facebook.com/something") == True
|
||||
assert is_blacklisted("https://en.wikipedia.org/wiki/Test") == False
|
||||
|
||||
Reference in New Issue
Block a user