🎯 カスタマイズ可能で検出回避型のクラウドブラウザ。自社開発のChromiumを搭載し、ウェブクローラーAIエージェント向けに設計されています。👉今すぐ試す
ブログに戻ります

Trafilaturaウェブスクレイピング:LLM用のクリーンなテキスト抽出

Isabella Garcia
Isabella Garcia

Web Data Collection Specialist

22-Jul-2026

TL;DR:

  • Trafilaturaは、生のHTMLページをクリーンな主要コンテンツテキストに変換し、ナビゲーション、サイドバー、フッターを取り除いて、言語モデルがコンテンツを見れるようにします。
  • 例のページでは、9,275文字のHTMLが1,324文字のクリーンなテキストになり、86%の削減がLLMのコンテキストウィンドウに直接入ります。
  • Trafilaturaにはクリアブロックを行うフェッチレイヤーがないため、このガイドではScrapelessによる取得とTrafilaturaによる抽出を組み合わせています。
  • trafilatura.extractはプレーンテキストを生成し、output_format="markdown"または"json"の同じ呼び出しはMarkdownまたはタイトル、著者、日付を含むメタデータレコードを返します。
  • 分割はクリーンです:Scrapelessがページを取得し、Trafilaturaがその中から記事を抽出します。
  • Scrapelessの無料プランを開始し、抽出ツールを自分のページに向けてください。

スクレイピングされたHTMLページは、ほとんどが望んでいるものではありません。ナビゲーション、クッキーバナー、関連する記事のレール、フッターはほとんどのバイトを占め、これらすべてを言語モデルに入力するとトークンを無駄にし、信号を希釈します。Trafilaturaは、その問題の後半を解決します:HTMLが与えられれば、それが主要コンテンツを見つけ出し、クリーンなテキストとして返します。最初の半分は解決しません。なぜなら、反発するページをフェッチできないからです。

このガイドは二つの半分を組み合わせています。Scrapeless Universal Scraping APIがページを取得し、Trafilaturaが記事を抽出します。以下のすべての数字は、実際の公開ページに対する実行からのものです。

Trafilaturaの機能

Trafilaturaは主要コンテンツ抽出ライブラリです:HTMLを読み取り、周囲のボイラープレートなしで記事テキストを返します。ページの構造を通じてコンテンツとナビゲーションを区別し、その抽出品質はそれを紹介するピアレビュー論文でベンチマークされています。取得またはLLMパイプラインを構築する人にとって、それは「HTMLがある」と「埋め込みに値するテキストがある」の間のステップです。

Trafilaturaはスクレイパーではありません。ブラウザもプロキシも、アクセスチャレンジを通過する方法もありません。組み込みのfetch_urlはプレーンなHTTPクライアントですので、保護されたページではブロックページを取得し、しっかりとブロックを抽出します。それが、取得がそれに特化したツールに属する理由です。

インストール

Trafilaturaは、単一のpipインストールです。

bash Copy
pip install trafilatura

シェルでScrapelessキーを設定します。実行時には実際のキーを使用し、プレースホルダーはソースから除いておいてください。

bash Copy
export SCRAPELESS_API_KEY="sk_your_key_here"

基本的な抽出

Scrapelessでページを取得し、次にHTMLをtrafilatura.extractに渡します。それは主要なコンテンツをクリーンなテキストとして返します。

python Copy
import json
import os
import urllib.request

import trafilatura

API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"


def fetch_html(url: str) -> str:
    payload = json.dumps(
        {"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
    ).encode()
    request = urllib.request.Request(
        API_URL,
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=90) as response:
        return json.loads(response.read())["data"]


html = fetch_html(TARGET)
text = trafilatura.extract(html)
print(f"生のhtml文字数: {len(html)}")
print(f"クリーンテキスト文字数: {len(text)}")
print(f"ボイラープレート削除: {100 * (1 - len(text) / len(html)):.0f}%")

出力は、クロームが取り除かれた後にページがどれだけ縮小するかを示しています。

text Copy
生のhtml文字数: 9275
クリーンテキスト文字数: 1324
ボイラープレート削除: 86%

残る1,324文字は、タイトル、価格、在庫、製品説明であり、ナビゲーション、パンくずリスト、フッターは削除されています。その86%の削減は、もはやモデルに読み込ませるために支払う必要のないトークンです。

Markdownとメタデータ

プレーンテキストがデフォルトですが、取得パイプラインは通常、構造を望みます。同じextract呼び出しはoutput_formatを取りますので、Markdownは見出しやリストを保持し、モデルが読みやすくなります。

python Copy
markdown = trafilatura.extract(html, output_format="markdown")
print(f"markdown文字数: {len(markdown)}")

出所を求めるために、メタデータ付きのJSONを要求します。レコードはタイトル、著者、ホスト名、日付、言語をテキストと共に運び、埋め込みの横に保存され、取得したチャンクがその出所を引用できます。

python Copy
record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"タイトル: {record['title']}")

完全な抽出ツール

フェッチ、テキスト、Markdown、メタデータをまとめて、1つのスクリプトがダウンストリームパイプラインに必要なすべてのURLを受け取ります。

python Copy
import json
import os
import urllib.request

import trafilatura

API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"


def fetch_html(url: str) -> str:
    payload = json.dumps(
        {"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
    ).encode()
    request = urllib.request.Request(
        API_URL,
        data=payload,
        headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
        method="POST",
    )
    with urllib.request.urlopen(request, timeout=90) as response:
        return json.loads(response.read())["data"]


html = fetch_html(TARGET)
print(f"生のHTML文字数: {len(html)}")

text = trafilatura.extract(html)
print(f"クリーンテキスト文字数: {len(text)}")
print(f"ボイラープレート削除率: {100 * (1 - len(text) / len(html)):.0f}%")

markdown = trafilatura.extract(html, output_format="markdown")
print(f"Markdown文字数: {len(markdown)}")

record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"タイトル: {record['title']}")

実行結果は、パイプラインが消費する各出力を報告します。

text Copy
生のHTML文字数: 9275
クリーンテキスト文字数: 1324
ボイラープレート削除率: 86%
Markdown文字数: 1474
タイトル: A Light in the Attic

Trafilaturaが停止する場所

Trafilaturaは抽出を行いますが、ブロックを越えて取得することはしません。その境界が、このガイドが2つのツールを使用する理由です。Trafilatura自身のフェッチを保護されたページにポイントすると、チャレンジを受けるか空のシェルを受け取り、そこから有用なものを抽出できません。Scrapelessは取得を処理し、レンダリングされたHTMLを返し、Trafilaturaがその後を引き継ぎます。ターゲットがJavaScriptで記事をレンダリングする場合、リクエスト内の js_renderTrue に設定すると、Trafilaturaが受け取るHTMLにはすでにコンテンツが含まれます。マークアップがサーバーレンダーされたときは、ここでのように False にします。

サイト全体でこれを実行する前に、その robots.txt と利用規約を読みます。 ロボット排除プロトコル は、サイトが自動クライアントに避けてほしいパスを示しており、これを守ることで抽出パイプラインを持続可能に保ちます。広範な取り込みの観点では、RAGのためのクリーンなウェブテキストパイプラインの構築に関するガイド が、この抽出ステップの位置を示します。

自分のページで試してみたいですか? 無料のScrapelessアカウントを作成し、ターゲットURLを変更してください。

結論

クリーンなテキストは、言語モデルが実際に必要とするものであり、そこへ到達するには2つのステップが必要です:取得して、次に抽出します。Scrapelessはページを返し、Trafilaturaは9,275文字のHTMLを1,324文字のコンテンツに変換します。テキスト、Markdown、またはメタデータレコードの形式です。 Trafilaturaのドキュメント は、出力形式と調整オプションを完全にカバーしています。完全なスクリプトから始めて、自分のURLを入れ替え、その結果を埋め込みまたはLLMステップに供給してください。

Scrapelessの無料プランで始めることで、自分のページを取得し、定期的なジョブをサイズアップする際はScrapelessの料金を確認してください。

FAQ

Q: Trafilaturaはウェブページを自分でフェッチしますか?

それには内蔵の fetch_url が備わっていますが、それはブロック解除のない単純なHTTPクライアントであるため、アクセスチャレンジの背後にあるページでは失敗します。レンダリングされたHTMLを返す取得ツール(Scrapelessなど)と組み合わせて、Trafilaturaが得意なHTMLからメインコンテンツを抽出することをさせてください。

Q: TrafilaturaはBeautifulSoupとどう違いますか?

BeautifulSoupはパーサーです:どの要素を選択するかを指定します。Trafilaturaは抽出器です:ページのどの部分がメインコンテンツであるかを決定し、それを返します。選択子を書く必要がありません。特定のフィールドが必要な場合はBeautifulSoupを使用し、クリーンなテキストとして記事本文を取得したい場合はTrafilaturaを使用します。

Q: Trafilaturaはどの出力形式をサポートしていますか?

extract 関数は txt(デフォルト)、markdownjson または xmloutput_format を受け取ります。MarkdownはLLM入力用に見出しやリストを保持し、with_metadata=True のJSONはテキストの横にタイトル、著者、日付、言語を追加します。

Q: Trafilaturaはタイトルと著者を保持できますか?
はい。output_format="json"with_metadata=Trueを指定してextractを呼び出すと、返されるレコードにはtitleauthorhostnamedatelanguageが含まれます。そのメタデータを埋め込みと一緒に保存することで、取得したチャンクがどこから来たのかを報告できます。

Q: なぜ全ページをLLMに送るのではなく、メインコンテンツを抽出するのですか?

ページのほとんどはナビゲーション、広告、フッターであり、例のページでは86%の文字数を占めています。すべてを送信するとトークンがかかり、信号が埋もれてしまうため、まずメインコンテンツを抽出することでコストを削減し、モデルが重要なテキストに集中するのを改善します。

Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。

最も人気のある記事

カタログ