Skip to content

設定実践

Config 構造体には 30 以上のフィールドがありますが、日常的な使用ではいくつかの主要な設定グループを理解するだけで十分です。このガイドはシーンに合った設定方法を素早く選択するのに役立ちます。完全なフィールド説明は API リファレンス:設定 を参照してください。

4 種のプリセット

ライブラリは 4 種類のプリセットを提供し、ほとんどのシーンをカバーします:

プリセット適用シーン主な違い
DefaultConfig()汎用抽出全機能有効、安全なデフォルト値
HighSecurityConfig()信頼できない入力制限を強化、監査を有効化、深さ上限を引き下げ
TextOnlyConfig()プレーンテキストのみすべてのメディア保持を無効化、最大パフォーマンス
MarkdownConfig()Markdown 出力インライン画像/リンクを Markdown 形式に変換
go
package main

import (
    "fmt"
    "log"

    "github.com/cybergodev/html"
)

func main() {
    data := []byte(`<html><body><h1>タイトル</h1><p>本文コンテンツ</p></body></html>`)

    // ほとんどのシーン:デフォルト設定をそのまま使用
    p1, _ := html.New()
    defer p1.Close()
    r1, _ := p1.Extract(data)
    fmt.Println(r1.Title)

    // プレーンテキストのみ必要(検索エンジンインデックスなど)
    p2, _ := html.New(html.TextOnlyConfig())
    defer p2.Close()

    // Markdown を出力(CMS マイグレーションなど)
    p3, _ := html.New(html.MarkdownConfig())
    defer p3.Close()
    md, _ := p3.ExtractToMarkdown(data)
    fmt.Println(md)
}

プリセットから始める

迷った場合は DefaultConfig() から始め、必要に応じて個別フィールドを調整します。プリセットは組み合わせ可能で、あるプリセットを取得した後にフィールドを上書きできます:

go
cfg := html.HighSecurityConfig()
cfg.PreserveImages = false // 高セキュリティ設定に加えて画像を無効化
processor, _ := html.New(cfg)

6 分類のフィールドガイド

リソース管理

メモリ使用量とパフォーマンスを制御します。日常的な開発では調整の必要は通常ありません。

フィールドデフォルト値説明
MaxInputSize50 MB最大入力サイズ、メモリ枯渇を防止
MaxCacheEntries2000キャッシュエントリ数の上限、0 でキャッシュ無効
CacheTTL1 時間キャッシュの生存時間
CacheCleanup5 分バックグラウンドの期限切れキャッシュのクリーンアップ間隔
WorkerPoolSize4バッチ処理の並行数(1–256)
ProcessingTimeout30 秒1 ドキュメントあたりの処理タイムアウト、0 で無制限

キャッシュは Processor インスタンスのみ有効

パッケージレベル関数(html.Extract など)はプールされた Processor を使用し、呼び出しごとにキャッシュをクリアします。キャッシュが必要な場合は html.New() で独立した Processor を作成してください。詳細は Processor 再利用とキャッシュ を参照してください。

セキュリティ

セキュリティ設定は本番環境で重点的に確認すべき項目です。完全なセキュリティ機能の紹介は セキュリティ概要 を参照してください。

フィールドデフォルト値説明
EnableSanitizationtrueHTML サニタイズ(危険なタグ/属性を除去)
MaxDepth500DOM ネスト深さの上限、スタックオーバーフローを防止
AllowedBaseDir""ファイル操作のサンドボックスディレクトリ、空 = 制限なし
Audit無効セキュリティ監査ログの設定

AllowedBaseDir

ユーザー提供のファイルパスを処理する際は、必ず AllowedBaseDir を設定してください。OS のファイルハンドルを通じて実際のパスを解決し、シンボリックリンクや Windows junction の回避を防止します。

コンテンツ抽出

HTML からどのコンテンツを抽出するかを制御します。

フィールドデフォルト値説明
ExtractArticletrueスマート記事認識(メインコンテンツを自動特定)
PreserveImagestrue画像情報を保持
PreserveLinkstrueリンク情報を保持
PreserveVideostrue動画を抽出
PreserveAudiostrue音声を抽出

不要なメディアタイプを無効化するとパフォーマンスが向上します:

go
cfg := html.DefaultConfig()
cfg.PreserveVideos = false
cfg.PreserveAudios = false
// テキスト、画像、リンクのみ抽出

出力フォーマット

テキスト出力における画像とリンクの表示方法を制御します。詳細は 出力フォーマット実践 を参照してください。

フィールドデフォルト値選択可能な値
InlineImageFormat"none""none", "markdown", "html", "placeholder"
InlineLinkFormat"none""none", "markdown", "html"
TableFormat"markdown""markdown", "html"
Encoding""(自動)"utf-8", "gbk", "shift_jis", "windows-1252" など

Encoding を空欄にすると自動検出されます。手動指定すると検出ステップをスキップできパフォーマンスが向上しますが、エンコーディングが確実に分かっている場合のみ使用してください。詳細は エンコーディング検出実践 を参照してください。

リンク抽出

以下のフィールドは ExtractAllLinks でのみ有効で、どの種類のリソースリンクを抽出するかを制御します。詳細は リンク抽出実践 を参照してください。

フィールドデフォルト値説明
ResolveRelativeURLstrue相対 URL を絶対 URL に解決
BaseURL""解決のベース、空欄時は HTML から自動検出
IncludeImagestrue<img> リンクを含む
IncludeVideostrue<video>/<iframe> リンクを含む
IncludeAudiostrue<audio> リンクを含む
IncludeCSStrue<link rel="stylesheet"> を含む
IncludeJStrue<script src> を含む
IncludeContentLinkstrue<a href> サイト内リンクを含む
IncludeExternalLinkstrueサイト外リンクを含む
IncludeIconstruefavicon/アイコンを含む

リンク抽出とコンテンツ抽出の違い

Include* フィールドは ExtractAllLinks にのみ影響します。コンテンツ抽出(Extract)でのリンク保持は PreserveLinks で制御します。

拡張

フィールド説明
Scorerカスタムコンテンツスコアラー、nil の場合は DefaultScorer を使用

カスタム Scorer で特定のウェブサイト向けに記事認識を最適化できます。詳細は テストとカスタム拡張 を参照してください。

よくある設定組み合わせ

Web クローラー

高頻度バッチクロールのシーンでは、並行数を上げてタイムアウトを短くします:

go
package main

import (
    "log"
    "time"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.DefaultConfig()
    cfg.WorkerPoolSize = 8                          // バッチ並行数を向上
    cfg.ProcessingTimeout = 10 * time.Second        // タイムアウトを短縮
    cfg.PreserveVideos = false                      // クローラーには不要な動画
    cfg.PreserveAudios = false

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    // バッチ抽出
    pages := [][]byte{[]byte("<html><body>ページ1</body></html>")}
    batch := processor.ExtractBatch(pages)
    log.Printf("成功 %d、失敗 %d", batch.Success, batch.Failed)
}

API バックエンドサービス

ユーザーが送信した HTML を処理する場合、高セキュリティ設定を使用しファイルディレクトリを制限します:

go
package main

import (
    "log"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.HighSecurityConfig()
    cfg.AllowedBaseDir = "/var/www/uploads" // ファイルディレクトリを制限

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    // ユーザーがアップロードした HTML ファイルを処理
    result, err := processor.ExtractFromFile("/var/www/uploads/user.html")
    if err != nil {
        log.Fatal(err)
    }
    log.Println(result.Title)
}

コンテンツ移行ツール

旧サイトの HTML を Markdown に変換し、リンクを保持して相対 URL を解決します:

go
package main

import (
    "fmt"
    "log"

    "github.com/cybergodev/html"
)

func main() {
    cfg := html.MarkdownConfig()
    cfg.ResolveRelativeURLs = true
    cfg.BaseURL = "https://old-site.example.com"

    processor, err := html.New(cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer processor.Close()

    data := []byte(`<html><body><article><h1>旧記事</h1><a href="/post/123">リンク</a></article></body></html>`)
    md, err := processor.ExtractToMarkdown(data)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(md)
}

Validate

すべての設定は html.New() に渡された際に自動的に検証されます。手動で Validate() を呼び出して事前チェックすることも可能です:

go
cfg := html.DefaultConfig()
cfg.MaxInputSize = -1 // 意図的に誤った値を設定
if err := cfg.Validate(); err != nil {
    log.Fatal(err) // html: invalid config: MaxInputSize=-1, must be positive
}

検証ルールにはフィールドの範囲チェックとフォーマット文字列の検証が含まれます。無効な設定は *ConfigError を返し、errors.Is(err, html.ErrInvalidConfig) で判定できます。完全なフィールド制約は API リファレンス:設定 を参照してください。