Files
TextNLPClassifierApp/graphify-out/cache/ast/v0.9.47-s2/485f0e63023aa6dc8c4c64b22dd7394c032b7f468fa41632967789c4e269587b.json
andreferraro 6a45368cb0 feat(extractor): implement multi-engine article content extractor
- Added scripts/extract_article_contents.py for batch scraping with stealth Foxcape and triple extraction (Trafilatura, Newspaper4k, Readability)
- Created unit, integration, and E2E test suite in tests/test_extract_article_contents.py (90/90 passing)
- Updated specs/003-article-content-extractor and README.md with usage documentation and CLI contracts
- Passed ruff linting/formatting and mypy type checking cleanly
2026-08-20 19:22:20 -03:00

1 line
6.3 KiB
JSON

{"nodes": [{"id": "$graphify-root$_specs_003_article_content_extractor_research_md", "label": "research.md", "file_type": "document", "node_kind": "page", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_research_article_content_multi_engine_extractor", "label": "Research: Article Content Multi-Engine Extractor", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L1"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "label": "1. Technical Decisions & Tradeoffs", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L3"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_decision_1_motor_de_navega\u00e7\u00e3o_e_renderiza\u00e7\u00e3o_com_foxcape_em_sess\u00e3o_\u00fanica", "label": "Decision 1: Motor de Navega\u00e7\u00e3o e Renderiza\u00e7\u00e3o com `foxcape` em Sess\u00e3o \u00danica", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L5"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_decision_2_orquestra\u00e7\u00e3o_tripla_de_extra\u00e7\u00e3o_de_conte\u00fado_nlp_web_scraping", "label": "Decision 2: Orquestra\u00e7\u00e3o Tripla de Extra\u00e7\u00e3o de Conte\u00fado (NLP & Web Scraping)", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L17"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_decision_3_resili\u00eancia_e_isolamento_de_falhas_por_camada", "label": "Decision 3: Resili\u00eancia e Isolamento de Falhas por Camada", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L28"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_decision_4_heran\u00e7a_inteligente_de_idioma_para_nlp", "label": "Decision 4: Heran\u00e7a Inteligente de Idioma para NLP", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L36"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_decision_5_gerenciamento_de_mem\u00f3ria_e_descarte_do_raw_html", "label": "Decision 5: Gerenciamento de Mem\u00f3ria e Descarte do Raw HTML", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L42"}, {"id": "$graphify-root$_specs_003_article_content_extractor_research_decision_6_segrega\u00e7\u00e3o_de_streams_e_feedback_visual_em_stderr", "label": "Decision 6: Segrega\u00e7\u00e3o de Streams e Feedback Visual em `stderr`", "file_type": "document", "node_kind": "heading", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L48"}], "edges": [{"source": "$graphify-root$_specs_003_article_content_extractor_research_md", "target": "$graphify-root$_specs_003_article_content_extractor_research_research_article_content_multi_engine_extractor", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L1", "weight": 1.0}, {"source": "$graphify-root$_specs_003_article_content_extractor_research_research_article_content_multi_engine_extractor", "target": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L3", "weight": 1.0}, {"source": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "target": "$graphify-root$_specs_003_article_content_extractor_research_decision_1_motor_de_navega\u00e7\u00e3o_e_renderiza\u00e7\u00e3o_com_foxcape_em_sess\u00e3o_\u00fanica", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L5", "weight": 1.0}, {"source": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "target": "$graphify-root$_specs_003_article_content_extractor_research_decision_2_orquestra\u00e7\u00e3o_tripla_de_extra\u00e7\u00e3o_de_conte\u00fado_nlp_web_scraping", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L17", "weight": 1.0}, {"source": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "target": "$graphify-root$_specs_003_article_content_extractor_research_decision_3_resili\u00eancia_e_isolamento_de_falhas_por_camada", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L28", "weight": 1.0}, {"source": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "target": "$graphify-root$_specs_003_article_content_extractor_research_decision_4_heran\u00e7a_inteligente_de_idioma_para_nlp", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L36", "weight": 1.0}, {"source": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "target": "$graphify-root$_specs_003_article_content_extractor_research_decision_5_gerenciamento_de_mem\u00f3ria_e_descarte_do_raw_html", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L42", "weight": 1.0}, {"source": "$graphify-root$_specs_003_article_content_extractor_research_1_technical_decisions_tradeoffs", "target": "$graphify-root$_specs_003_article_content_extractor_research_decision_6_segrega\u00e7\u00e3o_de_streams_e_feedback_visual_em_stderr", "relation": "contains", "confidence": "EXTRACTED", "source_file": "specs/003-article-content-extractor/research.md", "source_location": "L48", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}