from pathlib import Path from src.scraping.convert import to_markdown from src.scraping.exceptions import ArticleNotFoundError, FetchError from src.scraping.extract import extract_main_html from src.scraping.fetch import fetch_html from src.scraping.io import save_markdown from src.scraping.textutil import compact_blank_lines async def run(url: str, out_dir: Path) -> Path: """ URLを取得→本文抽出→Markdown化→空行圧縮→保存 までを実行。 戻り値は保存先パス。 Raises: ArticleNotFoundError: 記事が存在しない場合 FetchError: ネットワークエラーの場合 """ # HTMLを取得(例外が発生する可能性あり) html = await fetch_html(url, timeout_s=25.0) # 本文抽出→Markdown化→空行圧縮→保存 main_html = extract_main_html(html) md_out = to_markdown(main_html) md_out = compact_blank_lines(md_out) return save_markdown(md_out, out_dir, url) async def to_markdown_from_url(url: str, timeout_s: float = 25.0) -> str: """ URLを取得→本文抽出→Markdown化→空行圧縮 までを実行してMarkdown文字列を返す。 Args: url: 取得対象URL timeout_s: 取得タイムアウト(秒) Returns: Markdown化された本文文字列 Raises: ArticleNotFoundError: 記事が存在しない場合 FetchError: ネットワークエラーの場合 """ html = await fetch_html(url, timeout_s=timeout_s) main_html = extract_main_html(html) md_out = to_markdown(main_html) return compact_blank_lines(md_out)