File size: 1,644 Bytes
fb05e78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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)