Closed5

HTMLを構造化データに変換する「Trafilatura」を試す

kun432kun432

名前だけ聞いたことしかなくて試したことがなかった。RAGで使うデータの前処理に使えそうな感じ。

GitHubレポジトリ
https://github.com/adbar/trafilatura

公式ドキュメント
https://trafilatura.readthedocs.io/en/latest/

Trafilatura: ウェブ上のテキストを収集するためのPythonパッケージとコマンドラインツール

説明

Trafilaturaは、ウェブ上のテキストを収集するために設計されたPythonパッケージおよびコマンドラインツールです。 検索、抽出、テキスト処理のコンポーネントを含んでいます。 主な用途は、ウェブクロール、ダウンロード、スクレイピング、および主要テキスト、メタデータ、コメントの抽出です。 使いやすさとモジュール性を重視しており、データベースは不要で、出力は一般的に使用されるフォーマットに変換できます。

生のHTMLから重要な部分を抽出することで、テキストの品質に関する多くの問題を軽減することができます。まず、ヘッダー、フッター、リンク/ブログロールなどの繰り返し現れる要素によるノイズを回避し、次に、データの意味を理解するために、著者や日付などの情報を含めることで、テキストの品質に関する多くの問題を軽減することができます。抽出ツールは、ノイズを最小限に抑えること(正確性)と、有効な部分をすべて含めること(再現性)のバランスを取ることを試みます。また、頑強で適度に高速であることも求められます。このツールは、何百万もの文書で実稼働しています。

このツールは、コーパス言語学、自然言語処理、計算社会科学、その他の分野における定量的研究に役立ちます。データサイエンス、情報抽出、テキストマイニング、検索エンジン最適化、ビジネス分析、情報セキュリティなどのスクレイピングを多用するユースケースに関心のある方には、このツールは有用です。

機能

  • 高度なウェブクロールとテキスト検索:
    • サイトマップ(TXT、XML)およびフィード(ATOM、JSON、RSS)のサポート
    • スマートクロールとURL管理(フィルタリングと重複排除)
  • オンラインおよびオフライン入力の並列処理:
    • ライブURL、ダウンロードキューの効率的かつ丁寧な処理
    • 以前にダウンロードしたHTMLファイルと解析済みHTMLツリー
  • 堅牢で設定可能な主要要素の抽出:
    • 本文(jusTextやreadabilityのような一般的なパターンやアルゴリズム)
    • メタデータ(タイトル、著者、日付、サイト名、カテゴリー、タグ)
    • フォーマットと構造:段落、タイトル、リスト、引用、コード、改行、インラインテキストのフォーマット
    • オプションの要素:コメント、リンク、画像、表
  • 複数の出力フォーマット:
    • TXTおよびMarkdown
    • CSV
    • JSON
    • HTML、XML、XML-TEI
  • オプションの追加機能:
    • 抽出コンテンツの言語検出
    • グラフィカルユーザーインターフェース(GUI)
    • スピードの最適化
  • オープンソースコミュニティのサポートによる積極的なメンテナンス:
    • 定期的なアップデート、機能追加、最適化
    • 包括的なドキュメント

評価と代替

Trafilaturaは、テキスト抽出ベンチマークにおいて、常に他のオープンソースライブラリを上回る性能を発揮しており、ウェブコンテンツの抽出におけるその効率性と正確性を示しています。抽出ツールは、ノイズを制限しつつ、有効な部分をすべて含めるというバランスを取ることを試みます。

ベンチマークセクションでは、代替案と結果について詳しく説明しています。評価のReadmeでは、評価の再現方法について説明しています。

ちなみに、

Trafilaturaとは、イタリア語で伸線加工を意味し、精製と転換のプロセスを象徴しています。また、パスタの形状を形成する方法でもあります。

だそう。

kun432kun432

インストール

https://trafilatura.readthedocs.io/en/latest/installation.html

最初、Colaboratoryでやろうと思ったのだが、オプションパッケージの中にpython-3.11が必要なものがありって「強く推奨」されているので、Ubuntuでやろうと思う。

オプションパッケージはこんな感じ。

  • brotli
    • ダウンロード用の追加圧縮アルゴリズム
  • cchardet / faust-cchardet (Python >= 3.11)
    • より高速なエンコーディング検出、またより正確な検出も可能(特にアジアで使用されるエンコーディングの場合)
    • 強く推奨
  • htmldate[all] / htmldate[speed]
    • 専用パッケージのシリーズにより、より高速かつ正確な日付抽出が可能に
  • py3langid
    • 抽出された本文の言語判別
  • pycurl
    • ダウンロードの高速化、ただし堅牢性は低下する可能性あり
  • zstandard
    • ダウンロード用の追加圧縮アルゴリズム

python-3.11の仮想環境を適宜用意しておくこと。ちなみに自分の環境は3.11.5。

では、パッケージインストール。オプションパッケージがいろいろあるようで、まとめてインストールするにはallを指定する。

$ pip install -U trafilatura[all]

以下がインストールされた

babel-2.16.0
brotli-1.1.0
certifi-2024.8.30
charset-normalizer-3.3.2
courlan-1.3.1
dateparser-1.2.0
faust-cchardet-2.1.19
htmldate-1.9.0
justext-3.0.1
lxml-5.3.0
lxml-html-clean-0.2.2
numpy-2.1.1
py3langid-0.3.0
pycurl-7.45.3
pysocks-1.7.1
python-dateutil-2.9.0.post0
pytz-2024.2
regex-2024.9.11
six-1.16.0
tld-0.13
trafilatura-1.12.2
tzlocal-5.2
urllib3-2.2.3
zstandard-0.23.0
kun432kun432

Quickstart

https://trafilatura.readthedocs.io/en/latest/quickstart.html

UsageとTutorialがあるようなのけど、まずはUsage>Quickstartで進める。

使い方は以下の2つ。

  • Pythonのモジュールとしてインポート
  • CLI

Pythonモジュールとしての使用

まずはPythonモジュールとして使う。自分の過去のZennの記事を抽出してみる。

https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1

sample.py
from trafilatura import fetch_url, extract

# URLからHTMLを取得
downloaded = fetch_url("https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1")

# メインのコンテンツをプレーンテキストで抽出
result = extract(downloaded)
print(result)
$ python sample.py | head -20
(日本語訳) Vector databases (Part 1): What makes each one different?
日本語訳: ベクトルデータベース(パート1): それぞれの違いは?
訳者前書き
ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、少しでも参照しやすくなればと考えて、作者であるPrashanth Rao氏に許可を頂いた上で日本語に翻訳したものとなっています。
全4回の記事の第1回目となります。
Prashanth Rao氏のGitHubアカウント
Prashanth Rao氏のTwitterアカウント
データベースをめぐるゴールドラッシュ
2023年上半期、ベクトルデータベースに関するマーケティングが(そして残念ながら誇大広告も)盛んに行われた。これを読んでいるあなたは、なぜこれほど多くの種類が存在するのか?それぞれの違いは何なのか?に興味があるだろう。名目上は、ベクトルデータベースはどれも同じことをする(セマンティック検索を必要とする多くのアプリケーションを実現する)のに、それぞれについてどうやって根拠のある意見を持てるようになるのだろうか?🤔
この記事では、世の中にあるさまざまなベクトルデータベースの違いをできるだけ視覚的にわかりやすく取り上げる。さらに、私が比較したポイントも具体的に挙げて、全体的な理解を深める手助けをする。
たくさんの選択肢🤯
過去数ヶ月間にわたり、私はさまざまなベクトルデータベースやその内部構造を研究し、またPythonのAPI経由でアクセスしたりしてきたが、以下のような共通の問題点に遭遇した。
- 各データベースのベンダーは(当然のことではあるが)自社の機能を売り込みながら、同時に競合他社のものを低く見せる。このため、どこを見るかによってあなたの視点にバイアスがかかりやすい。
- 多数のベクトルDBのベンダーが存在し、全体像やその背景に存在する基盤技術を理解するためには、複数かつ大量の情報源を読み漁って、点と点を繋げていく必要がある。
- ベクトル検索に関しては、考慮すべきトレードオフが多数存在する。
-
ハイブリッドかキーワード検索か?
キーワード検索+ベクトル検索のハイブリッドが最良の結果をもたらす、これを認識している各ベクトルデータベースのベンダーは、独自のカスタムハイブリッド検索ソリューションを提供している。 -
オンプレミスかクラウドネイティブか?
多くのベンダーはインフラが世界で最も大きな課題であるかのように「クラウドネイティブ」を強調するが、長期的にはオンプレミスのデプロイメントの方が経済的かつ効果的なことが多い。 -

いい感じに取れている。

出力のカスタマイズ

出力のフォーマットを変えてみる。

XML

(snip)
result = extract(downloaded, output_format="xml")
(snip)
<doc fingerprint="2e9366aef5ae6151">
  <main>
    <head rend="h1">(日本語訳) Vector databases (Part 1): What makes each one different?</head>
    <head rend="h2">日本語訳: ベクトルデータベース(パート1): それぞれの違いは?</head>
    <head rend="h3">訳者前書き</head>
    <p>ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、少しでも参照しやすくなればと考えて、作者であるPrashanth Rao氏に許可を頂いた上で日本語に翻訳したものとなっています。</p>
    <p>全4回の記事の第1回目となります。</p>
    <p>Prashanth Rao氏のGitHubアカウント</p>
    <p>Prashanth Rao氏のTwitterアカウント</p>
    <head rend="h2">データベースをめぐるゴールドラッシュ</head>
    <p>2023年上半期、ベクトルデータベースに関するマーケティングが(そして残念ながら誇大広告も)盛んに行われた。これを読んでいるあなたは、なぜこれほど多くの種類が存在するのか?それぞれの違いは何なのか?に興味があるだろう。名目上は、ベクトルデータベースはどれも同じことをする(セマンティック検索を必要とする多くのアプリケーションを実現する)のに、それぞれについてどうやって根拠のある意見を持てるようになるのだろうか?🤔</p>
    <p>この記事では、世の中にあるさまざまなベクトルデータベースの違いをできるだけ視覚的にわかりやすく取り上げる。さらに、私が比較したポイントも具体的に挙げて、全体的な理解を深める手助けをする。</p>
    <head rend="h3">たくさんの選択肢🤯</head>
    <p>過去数ヶ月間にわたり、私はさまざまなベクトルデータベースやその内部構造を研究し、またPythonのAPI経由でアクセスしたりしてきたが、以下のような共通の問題点に遭遇した。</p>
    <list rend="ol">
      <item>各データベースのベンダーは(当然のことではあるが)自社の機能を売り込みながら、同時に競合他社のものを低く見せる。このため、どこを見るかによってあなたの視点にバイアスがかかりやすい。</item>
      <item>多数のベクトルDBのベンダーが存在し、全体像やその背景に存在する基盤技術を理解するためには、複数かつ大量の情報源を読み漁って、点と点を繋げていく必要がある。</item>
      <item>ベクトル検索に関しては、考慮すべきトレードオフが多数存在する。 <list rend="ul"><item> ハイブリッドかキーワード検索か?<lb/>キーワード検索+ベクトル検索のハイブリッドが最良の結果をもたらす、これを認識している各ベクトルデータベースのベンダーは、独自のカスタムハイブリッド検索ソリューションを提供している。</item><item> オンプレミスかクラウドネイティブか?<lb/>多くのベンダーはインフラが世界で最も大きな課題であるかのように「クラウドネイティブ」を強調するが、長期的にはオンプレミスのデプロイメントの方が経済的かつ効果的なことが多い。</item><item> オープンソースか?フルマネージドか?<lb/>ほとんどのベンダーは基本的な方法論として、ソースが入手可能なこと、またはオープンソースのコードベースの上に成り立っており、パイプラインのデプロイとインフラ部分(フルマネージドSaaSという形)で収益化している。それらの多くをセルフホスティングすることも能だが、それには追加の人手や社内のスキルが必要となる。</item></list></item>
      <item> ハイブリッドかキーワード検索か?</item>
    </list>

JSON

(snip)
result = extract(downloaded, output_format="json")
(snip)
$ python sample.py | jq -r .
{
  "text": "(日本語訳) Vector databases (Part 1): What makes each one different?\n日本語訳: ベクトルデータベース(パート1): それぞれの違いは?\n訳者前書き\nベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、(snip)Weaviate blog ↩︎\n-\n\"Fireside Chat with Jeff Huber, co-founder of Chroma\", Data Driven NYC ↩︎",
  "comments": "Discussion\nベクトルDBの比較についてはこのあたりも参考になるかもしれません\nベクトルDBの内部理解についてはこのあたりも参考になるかもしれません"
}

元記事のコメント部分が別のキーで含まれている。このコメントをなくす。

(snip)
result = extract(downloaded, output_format="json", include_comments=False)
(snip)
$ python sample.py | jq -r .
{
  "text": "(日本語訳) Vector databases (Part 1): What makes each one different?\n日本語訳: ベクトルデータベース(パート1): それぞれの違いは?\n訳者前書き\nベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、(snip)Weaviate blog ↩︎\n-\n\"Fireside Chat with Jeff Huber, co-founder of Chroma\", Data Driven NYC ↩︎Discussion\nベクトルDBの比較についてはこのあたりも参考になるかもしれません\nベクトルDBの内部理解についてはこのあたりも参考になるかもしれません"
}

コメント部分がメインコンテンツと一緒になっているのがわかる。

次にMarkdownにして、今回はメタデータを付与する。

(snip)
result = extract(downloaded, output_format="markdown", with_metadata=True)
(snip)
$ python sample.py | head -20
---
title: (日本語訳) Vector databases (Part 1): What makes each one different?
url: https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1
hostname: zenn.dev
sitename: Zenn
date: 2023-09-21
---
# (日本語訳) Vector databases (Part 1): What makes each one different?

## 日本語訳: ベクトルデータベース(パート1): それぞれの違いは?

### 訳者前書き

ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、少しでも参照しやすくなればと考えて、作者であるPrashanth Rao氏に許可を頂いた上で日本語に翻訳したものとなっています。

**全4回**の記事の**第1回目**となります。


Prashanth Rao氏のGitHubアカウント

冒頭に記事に関するメタデータが含まれているのがわかる。

高速モード

「高速モードだとフォールバックアルゴリズムをバイパスでき、性能を改善するが抽出精度に影響が出る」とあるが、そもそもフォールバックアルゴリズムとは何なのだろうか?

以下のページを見る。
https://trafilatura.readthedocs.io/en/latest/usage-python.html

抽出関数

これらの関数は、trafilatura import ... を使用してインポートし、生のドキュメント(文字列)または解析済みのHTML(LXML要素)で使用することができます。

  • 本文の抽出、精度と再現性のバランスが良好:
    • extract:ラッパー関数、テキストの抽出と変換を実行する最も簡単な方法
    • bare_extraction:Pythonの素の変数を返す内部関数
  • 追加のフォールバック関数:
    • baseline:テキストの段落および/またはJSONメタデータを対象とした高速な抽出関数
    • html2txt:ドキュメント内のすべてのテキストを抽出、再現性を最大化

んー、ちょっとピンとこないのだけど、おそらく内部的に抽出する際にいくつかの方式を持っていて、それらの一部を無効化するので高速になる、のだろうと推測する。no_fallback=Trueを付与するみたい。

from trafilatura import fetch_url, extract

downloaded = fetch_url("https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1")
result = extract(downloaded, no_fallback=True)
print(result)

すべてのテキストコンテンツを抽出する

メインコンテンツだけでなく、すべてのテキストコンテンツを抽出する。

sample.py
from trafilatura import fetch_url, html2txt

downloaded = fetch_url("https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1")
result = html2txt(downloaded)
print(result)
$ python sample.py
Zenn🔡(日本語訳) Vector databases (Part 1): What makes each one different?2023/09/21に公開2023/09/281件VectorDBvectorsearchvectordatabasevectorstoretech 日本語訳: ベクトルデータベース(パート1): それぞれの違いは? 訳者前書き ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。(snip)

Zennの公開日・更新日・コメントの数なども含まれているのがわかる。

メタデータ

ここはすでに上で説明したので省略。

CLIとしての使用

次にCLI。パッケージをインストーするとtrafilaturaコマンドもインストールされる。

$ trafilatura --version
Trafilatura 1.12.2 - Python 3.11.5

コードで書いたのと同じようにいくつかやってみる。

$ trafilatura -u "https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1" | head -20
(日本語訳) Vector databases (Part 1): What makes each one different?
日本語訳: ベクトルデータベース(パート1): それぞれの違いは?
訳者前書き
ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、少しでも参照しやすくなればと考えて、作者であるPrashanth Rao氏に許可を頂いた上で日本語に翻訳したものとなっています。
全4回の記事の第1回目となります。
Prashanth Rao氏のGitHubアカウント
Prashanth Rao氏のTwitterアカウント
データベースをめぐるゴールドラッシュ
2023年上半期、ベクトルデータベースに関するマーケティングが(そして残念ながら誇大広告も)盛んに行われた。これを読んでいるあなたは、なぜこれほど多くの種類が存在するのか?それぞれの違いは何なのか?に興味があるだろう。名目上は、ベクトルデータベースはどれも同じことをする(セマンティック検索を必要とする多くのアプリケーションを実現する)のに、それぞれについてどうやって根拠のある意見を持てるようになるのだろうか?🤔
この記事では、世の中にあるさまざまなベクトルデータベースの違いをできるだけ視覚的にわかりやすく取り上げる。さらに、私が比較したポイントも具体的に挙げて、全体的な理解を深める手助けをする。
たくさんの選択肢🤯
過去数ヶ月間にわたり、私はさまざまなベクトルデータベースやその内部構造を研究し、またPythonのAPI経由でアクセスしたりしてきたが、以下のような共通の問題点に遭遇した。
- 各データベースのベンダーは(当然のことではあるが)自社の機能を売り込みながら、同時に競合他社のものを低く見せる。このため、どこを見るかによってあなたの視点にバイアスがかかりやすい。
- 多数のベクトルDBのベンダーが存在し、全体像やその背景に存在する基盤技術を理解するためには、複数かつ大量の情報源を読み漁って、点と点を繋げていく必要がある。
- ベクトル検索に関しては、考慮すべきトレードオフが多数存在する。
-
ハイブリッドかキーワード検索か?
キーワード検索+ベクトル検索のハイブリッドが最良の結果をもたらす、これを認識している各ベクトルデータベースのベンダーは、独自のカスタムハイブリッド検索ソリューションを提供している。 -
オンプレミスかクラウドネイティブか?
多くのベンダーはインフラが世界で最も大きな課題であるかのように「クラウドネイティブ」を強調するが、長期的にはオンプレミスのデプロイメントの方が経済的かつ効果的なことが多い。 -
$ trafilatura -u "https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1" --markdown | head -20
# (日本語訳) Vector databases (Part 1): What makes each one different?

## 日本語訳: ベクトルデータベース(パート1): それぞれの違いは?

### 訳者前書き

ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、少しでも参照しやすくなればと考えて、作者であるPrashanth Rao氏に許可を頂いた上で日本語に翻訳したものとなっています。

**全4回**の記事の**第1回目**となります。


Prashanth Rao氏のGitHubアカウント

Prashanth Rao氏のTwitterアカウント

## データベースをめぐるゴールドラッシュ

2023年上半期、ベクトルデータベースに関するマーケティングが(そして残念ながら誇大広告も)盛んに行われた。これを読んでいるあなたは、なぜこれほど多くの種類が存在するのか?それぞれの違いは何なのか?に興味があるだろう。名目上は、ベクトルデータベースはどれも同じことをする(セマンティック検索を必要とする多くのアプリケーションを実現する)のに、それぞれについてどうやって根拠のある意見を持てるようになるのだろうか?🤔

この記事では、世の中にあるさまざまなベクトルデータベースの違いをできるだけ視覚的にわかりやすく取り上げる。さらに、私が比較したポイントも具体的に挙げて、全体的な理解を深める手助けをする。

ファイルからパイプで渡すこともできる。

まずHTMLとしてダウンロード

$ wget https://zenn.dev/kun432/articles/20230921-vector-databases-jp-part-1 -O my_article.html

以下のような感じで。

$ cat my_article.html | trafilatura | head -5

# もしくは

$ < my_article.html trafilatura | head -5
(日本語訳) Vector databases (Part 1): What makes each one different?
日本語訳: ベクトルデータベース(パート1): それぞれの違いは?
訳者前書き
ベクトルデータベースについていろいろと調査・検証していたところ、以下の記事を見つけて、内容が非常によくまとまっており、多くの人にとっても有用な記事ではないか感じました。もはや翻訳などはDeepLやChatGPTで簡単にできる時代になりつつありますが、まだまだ検索エンジンで検索されることも多いと思いますし、少しでも参照しやすくなればと考えて、作者であるPrashanth Rao氏に許可を頂いた上で日本語に翻訳したものとなっています。
全4回の記事の第1回目となります。

Usageはこんな感じ。

$ trafilatura --help
usage: trafilatura [-h] [-i INPUT_FILE | --input-dir INPUT_DIR | -u URL] [--parallel PARALLEL] [-b BLACKLIST] [--list]
                   [-o OUTPUT_DIR] [--backup-dir BACKUP_DIR] [--keep-dirs] [--feed [FEED] | --sitemap [SITEMAP] |
                   --crawl [CRAWL] | --explore [EXPLORE] | --probe [PROBE]] [--archived]
                   [--url-filter URL_FILTER [URL_FILTER ...]] [-f] [--formatting] [--links] [--images] [--no-comments]
                   [--no-tables] [--only-with-metadata] [--with-metadata] [--target-language TARGET_LANGUAGE]
                   [--deduplicate] [--config-file CONFIG_FILE] [--precision] [--recall]
                   [--output-format {csv,json,html,markdown,txt,xml,xmltei} | --csv | --html | --json | --markdown | --xml | --xmltei]
                   [--validate-tei] [-v] [--version]

Command-line interface for Trafilatura

options:
  -h, --help            show this help message and exit
  -v, --verbose         increase logging verbosity (-v or -vv)
  --version             show version information and exit

Input:
  URLs, files or directories to process

  -i INPUT_FILE, --input-file INPUT_FILE
                        name of input file for batch processing
  --input-dir INPUT_DIR
                        read files from a specified directory (relative path)
  -u URL, --URL URL     custom URL download
  --parallel PARALLEL   specify a number of cores/threads for downloads and/or processing
  -b BLACKLIST, --blacklist BLACKLIST
                        file containing unwanted URLs to discard during processing

Output:
  Determines if and how files will be written

  --list                display a list of URLs without downloading them
  -o OUTPUT_DIR, --output-dir OUTPUT_DIR
                        write results in a specified directory (relative path)
  --backup-dir BACKUP_DIR
                        preserve a copy of downloaded files in a backup directory
  --keep-dirs           keep input directory structure and file names

Navigation:
  Link discovery and web crawling

  --feed [FEED]         look for feeds and/or pass a feed URL as input
  --sitemap [SITEMAP]   look for sitemaps for the given website and/or enter a sitemap URL
  --crawl [CRAWL]       crawl a fixed number of pages within a website starting from the given URL
  --explore [EXPLORE]   explore the given websites (combination of sitemap and crawl)
  --probe [PROBE]       probe for extractable content (works best with target language)
  --archived            try to fetch URLs from the Internet Archive if downloads fail
  --url-filter URL_FILTER [URL_FILTER ...]
                        only process/output URLs containing these patterns (space-separated strings)

Extraction:
  Customization of text and metadata processing

  -f, --fast            fast (without fallback detection)
  --formatting          include text formatting (bold, italic, etc.)
  --links               include links along with their targets (experimental)
  --images              include image sources in output (experimental)
  --no-comments         don't output any comments
  --no-tables           don't output any table elements
  --only-with-metadata  only output those documents with title, URL and date
  --with-metadata       extract and add metadata to the output
  --target-language TARGET_LANGUAGE
                        select a target language (ISO 639-1 codes)
  --deduplicate         filter out duplicate documents and sections
  --config-file CONFIG_FILE
                        override standard extraction parameters with a custom config file
  --precision           favor extraction precision (less noise, possibly less text)
  --recall              favor extraction recall (more text, possibly more noise)

Format:
  Selection of the output format

  --output-format {csv,json,html,markdown,txt,xml,xmltei}
                        determine output format
  --csv                 shorthand for CSV output
  --html                shorthand for HTML output
  --json                shorthand for JSON output
  --markdown            shorthand for MD output
  --xml                 shorthand for XML output
  --xmltei              shorthand for XML TEI output
  --validate-tei        validate XML TEI output

1つのURLからリンクを辿ってクローリングすることもできるみたい。

kun432kun432

まとめ

まだ全然触りの部分だけなのだが、思いの外きれいな出力が得られる印象。いくつか他のページでも試してみたけども、比較的きれいな感じで取れる。

この手のものは色々試していて、ちょっと前にCrawl4AIを試したところだけども、

https://zenn.dev/kun432/scraps/feec7e2370450c

https://zenn.dev/kun432/scraps/ce65ff8231911d

https://zenn.dev/kun432/scraps/58fce97899cfdd

https://zenn.dev/kun432/scraps/0d78afd06b6577

HTMLを「そこそこ」きれいなMarkdownとして取りたい、という目的だけなら、個人的には、Firecrawl、Crawl4AI、Trafilaturaのどれ使っても悪くないと思う。たぶん抽出されたMarkdownの何に?どこまで?期待するかによって違うんだろうけど。

以下、あくまでも個人的な印象、というか単に好みの話かも。

  • 往々にしてHTMLのTableは鬼門。自分の感覚的には、Firecrawlが一番キレイにTableをMarkdownの表にしようとしてくれる印象がある(ただし、完全ではない)。Crawl4AIも悪くない。
  • Trafilaturaは余計なゴミをかなり減らしてくれる印象。Firecrawlも悪くないけど、多少は残る。Crawl4AIはextracted_contentを使いこなせればできそうなんだけど、なんか使いこなせない感があって、普通に使う分にはゴミ削除が必要な認識。
  • JinaはAPIで無料に使えるのでアプリに組み込みやすい。Crawl4AIとTrafilaturaもパッケージだけで使える。Firecrawlは有料クラウド使うか自分でセルフホストする手間が必要になる。
  • LLM連携できるもの、ScrapeGraphAIやCrawl4AIなんかは、 特定の情報を抽出する、もしくは変換するあたりを考えるならいいんだろうと思う。ただLLMを使うので、コスト・精度なんかも絡んでくるし、ちょっとそこまでなかなかできてない。

ページの作りによってツールとの相性とかありそうなので一概にどれが一番良いってのはないと思っていて、ただサラッとQuickStart的な感じで始めた場合、多分Trafilaturaが一番シンプルで、かつ、得られる結果の期待値が高い印象を持った。

kun432kun432

あとこういうのをWikipediaのページで試したらダメ、っていうか、Wikipediaのマークアップは情報量が多すぎてどれ使ってもゴミがたくさん入る印象・・・

このスクラップは2ヶ月前にクローズされました