

# ウェブページから抽出した本文を確認する方法

抽出したページのテキストを保存済みの元HTMLと照合し、重要な事実を失わずに不要な情報を取り除きます。Actorは、ホスト環境で動作するデータ収集プログラムです。Taskは、保存された入力設定です。Actorが収集元のデータ行を収集し、読者が分析を行います。

HTMLは、保存したページのマークアップです。ライブラリは、読者が別途インストールして使うコードです。ハッシュは、保存したファイルそのものを識別するための指紋に相当する値です。Noneまたは空の出力は、抽出結果を得られなかったことを表します。入力の取得状況、本文の取得状況、抽出の状況は分けて扱ってください。ログイン画面、アクセス確認画面、HTMLの外枠だけを取得しても、本文を取得したことにはなりません。レンダリングや非表示の内容へのアクセスは検証していません。

## ウェブページから抽出した本文を確認する

1. エージェントがページから必要とする情報と、その対象外となるページ内の領域を定義します。この方法で確認するのは、抽出の品質です。
2. 候補URLを探す必要がある場合は、公開されているGoogle Search Scraperのビルド1.0.15のActorをTaskとともに使います。保存済みの3クエリのサンプル全体を、目的の検索フレーズ1つに置き換えます。設定は、`queries` ["one intended phrase"]、`engines` ["bing"]、`maxResultsPerExecutedQuery` 2、`country` "US"、`language` "en"、`safeSearch` true、`includeSponsoredResults` falseです。検索候補として標準出力されるフィールドには、`engine`、`executedQuery`、`canonicalUrl`、`resultDomain`、`snippet`、`rank`、`page`、`observedAt`があります。出力の集計レコードには、`queriesRequested`、`searchesCompiled`、`executionsPlanned`、`enginesRequested`、`enginesSuccessful`、`enginesFailed`、`pagesAttempted`、`pagesParsed`、`candidatesSeen`、`resultsSaved`、`engineStatusCounts`、`queryResultCounts`、`stopReason`があります。今回のBingによる2行の対照検証では、docs.python.orgへの直接の候補URLとともに、クエリ、順位1と2、ページ1、観測時刻が返されました。また、解析済みページ数は1、stopReasonは`result_caps_reached`でした。この検証で確認できるのは、範囲を限定した候補の取得だけです。リンク先の取得、テキスト抽出、ほかの検索エンジンや市場は確認していません。ここで検索エンジンの検証結果が確認済みなのはBingだけです。
3. 取得が許可されているリンク先ページを別途取得し、最終URL、取得時刻、コンテンツタイプ、元HTMLを保存します。検索用Actorは、この取得を行いません。保存した入力に、目的の記事本文が実際に含まれていることを確認します。`fetch_failure`、`body_not_in_saved_html`、`extraction_unavailable`は区別して扱ってください。
4. バージョンとオプションを記録したうえで、保存済みHTMLに対して別のテキスト抽出ライブラリを実行します。当初のローカルHTMLテストケースは、インストール済みのバージョン2.0.0で`trafilatura.extract(html, include_comments=False)`を使って検証しました。現在のドキュメントが説明しているのはバージョン2.3.1なので、これらのバージョンに関する事実は分けて扱う必要があります。
5. 出力を採用する前に、元HTMLとの照合項目をいくつか定義します。必要な見出しや文章、否定や条件、単位付きの数値、除外すべきナビゲーション、フッター、コメントなどです。保存済みHTMLと返されたテキストを比較します。単位や否定表現が欠けると、意味が逆転することがあります。
6. 各確認結果をretained、changed、missing、unwanted_noise_present、cannot_resolveのいずれかとして記録し、元HTML内の正確な位置と抽出された該当箇所を添えます。役に立つ場合に限り、確認した事実の数を集計します。
7. 重要な確認項目が不合格になった場合は、内容が損なわれたテキストをエージェントに渡さず、保存済みHTMLと抽出設定を見直します。
8. 抽出について簡潔に記録して保存します。記録には、元URLと取得時の状況、HTMLの参照先またはハッシュ、抽出ツールのバージョンとオプション、出力の参照先、確認表、採否の判断を含めます。

当初の架空テストケース（保存済みHTMLの完全版）：「架空のトレーガイド」の保存済みHTMLには、ナビゲーション、ログイン、フッターの各ブロックと、記事、コメント欄があります。記事には「トレーが水平になるまで水を加えないでください」と「この架空の実演では、水を12ミリリットル使ってください」と書かれています。コメントとメニューには、記事に関係のない語句が含まれています。このテストケースでは、実際のリンク先をオンラインで取得していません。

| 確認項目 | 保存済みHTMLの内容 | 抽出されたテキストの出力 | 確認結果 |
| --- | --- | --- | --- |
| 必要な見出し | 架空のトレーガイド | 架空のトレーガイド | 保持 |
| 否定／条件 | トレーが水平になるまで水を加えないでください | トレーが水平になるまで水を加えないでください | 保持 |
| 数値と単位 | 12ミリリットル | 12ミリリットル | 保持 |
| ナビゲーションの識別用文字列 | NavigationMarker | 含まれない | 読者が作成した確認項目：不要な情報なし |
| フッターの識別用文字列 | FooterMarker | 含まれない | 読者が作成した確認項目：不要な情報なし |
| コメントの識別用文字列 | CommentsMarker | 含まれない | 読者が作成した確認項目：不要な情報なし |

インストール済みのバージョン2.0.0の抽出ツールを呼び出すと、空ではない本文が得られました。仮に「水を加えてください。12使ってください」のような出力だった場合は、必要な否定と条件が変わり、数値の単位も欠けているため、2つの確認項目が不合格になります。仮に出力が空だった場合は、事実が0件の記事としてではなく、`extraction_unavailable`として記録します。

## 次に行うこと

テキストを採用する前に、元ページの重要な指示1つと不要な情報の識別用文字列1つを、別途取得して保存したHTMLおよび別に実行した抽出の出力と照合してください。必要に応じてGoogle Search Scraperの[Actor](https://apify.com/chronometrica/google-search-scraper)と[Task](https://apify.com/chronometrica/google-search-scraper/examples/web-search-citation-sources)を使えますが、その用途はBingの候補取得に限られます。検索用Actorは、リンク先から抽出したテキストの点検や検証を行いません。

## 出典と参考資料

- [Trafilatura クイックスタート：](https://trafilatura.readthedocs.io/en/latest/quickstart.html)
- [TrafilaturaのPythonでの使い方：](https://trafilatura.readthedocs.io/en/latest/usage-python.html)
- [ウェブスクレイパーに関する議論：](https://www.reddit.com/r/LangChain/comments/1cf2dwc/what_web_scraper_for_web_search_agent/)