HTMLをテキストに変換する:Webページのファイルから言葉だけを取り出す
文書が欲しいわけではない場面があります。欲しいのは文の塊です。分類器の学習データ、トピックモデル用のコーパス、
埋め込みインデックス用のチャンク、どうせ書式を無視する要約器への入力——そういう相手にとっては、
#も|も**も、コストだけかかって何も返さない文字です。
このページはそのためにあります。.htmlまたは.htmのファイルを投げ込めば、
マークアップが消えて読める散文だけが返ってきます。タグも属性も構文もありません。無料、登録不要、
1ファイル50MBまで、変換後にファイルはどこにも保存されません。見出しの階層や表を残したい場合は
HTMLをMarkdownに変換が
隣のページで、上の形式切り替えが選択済みのファイルをそのまま持っていくので、アップロードのやり直しは不要です。
HTMLのタグ除去で、実は間違えやすいところ
山かっこの間を単純に消すだけの実装はゴミを吐きます。その理由を知っておく価値はあります—— 使えるテキストと使い物にならないテキストの分かれ目がそこだからです。
HTMLにはブロック要素とインライン要素があり、この2つは正反対の扱いを必要とします。
</p>が閉じて次の<p>が開くなら、それは段落の境界であり、
改行にしなければなりません。一方、文の途中で</strong>が閉じるのは境界ではまったくなく、
そこに改行を入れれば文が真っ二つになります。ここを間違えると、
この機能は非推奨ですという一文が、1語を太字にしただけで3行に切り刻まれて出てきます。
もう半分の仕事は空白の処理です。HTMLは描画時に連続するスペース、タブ、改行を1つに畳むので、
インデントつきで整形されたソースには、そもそも見えることを想定していない空白が大量に含まれています。
まともなHTMLからテキストへの変換は、ブラウザと同じ畳み方をします。出力が
「ファイルの見た目」ではなく「ページの見え方」に沿って読めるのはそのためです。リスト項目はそれぞれ行を持ち、
<br>は改行になり、表のセルは互いにくっつかず区切られます。
実体参照、引用符、そして正体不明の文字
HTMLは、マークアップと衝突しないように一部の文字をエンコードします。&はアンパサンド、
<は小なり記号、 はノーブレークスペース、
’は丸いアポストロフィ、—はem dashです。
ブラウザで見ているとき、私たちが目にしているのはコードではなく文字のほうです。
抽出したテキストに実体参照が生のまま残っていると、これは毒になります。トークナイザーは
’をノイズだらけの複数トークンとして扱い、キーワード照合は
don’tに当たらず、後続の文字列比較が静かに壊れます。ですから出力の段階で
デコードしておきます。とくに厄介なのがノーブレークスペースで、画面上は普通のスペースと見分けがつかないのに、
書いたsplit(" ")を片っ端から素通りさせます。ここでは本物のスペースとして返ってきます。
文字コードも一度は確認しておいてください。最近のファイルはたいてい<meta charset="utf-8">を
宣言していますが、古いページやCMSからの書き出しはShift_JIS(CP932)やEUC-JPのままということがあります。
出力で「こんにちは」が縺薙s縺ォ縺。縺ッのように化けているなら、ファイルが名乗っている文字コードが
嘘をついています。テキストエディタでUTF-8として保存し直してから、もう一度変換してください。
読まれることを想定していないテキスト
ページは、見せている以上の言葉を抱えています。そのいくつかは抽出結果に顔を出します。
- ナビゲーションとフッター。メニューのラベル、パンくず、「ページ先頭へ」、 最下部に並ぶ80本のリンク。れっきとしたテキストですが、意味としては無価値です。保存したニュース記事では、 これが記事本文より多くなることさえあります。
- Cookieバナーと同意文言。そのドメインから保存するページすべてに付いてくる、 200語ほどの定型文。コーパスを作るなら、これから1000回複製しようとしているということです。
- alt属性とARIAラベル。価値があることもあり——グラフのalt属性がそのデータの唯一の 説明だったりします——「画像」という語が40回並ぶだけのこともあります。
- 非表示要素。スクリーンリーダー専用のspan、閉じたアコーディオンの中身、
<noscript>のフォールバック。描画された状態では一度も見ていなくても、 ソースには実際のテキストが入っています。
元ページの質が重要なら、ブラウザのリーダーモードで保存するのがおすすめです。ファイルになる前に 付属物の大半が落ちます。そうでなければ、変換してから出力の先頭と末尾を削ってください。 繰り返される定型文は、探すつもりで見ればすぐ分かりますし、それを切り落とす1分間が、 このパイプライン全体で最も費用対効果の高い1分です。
自然言語処理でMarkdownよりプレーンテキストが勝つ理由
これは「Markdownの簡易版」という話ではありません。多くのパイプラインではプレーンテキストが正解で、 Markdownはむしろ悪化要因です。
- 埋め込み。埋め込みモデルは渡されたものを構文ごとエンコードします。パイプ記号や 見出しの井桁は、意味を足さないままベクトルをずらし、しかもモデルの入力上限を食います。 素の散文のほうがきれいに埋め込まれます。
- 分類器とトピックモデル。Bag-of-wordsやTF-IDF系の手法は、前処理をしないかぎり
**word**とwordを別のトークンとして扱います。問題そのものを持ち込まないのが 早道です。 - 検索インデックス。たいていのインデックス処理が欲しがるのは文です。Markdownを流し込むのは、 本来必要のなかった除去処理を1つ書くのと同じことです。
- 文分割。spaCyやNLTKのような分割器は散文を前提に動きます。表の記法は分割器を混乱させ、 断片を量産させます。
- トークン予算。長いページでは、マークアップを落とすだけでトークン数がはっきり減ります。 出力の下のカウンターが実際の差を示しますし、同じファイルで両形式を比べるのはクリック1回の実験です。
手元にあるファイルと、手元にないページ
このツールが変換するのは、アップロードしたHTMLファイルです。URLを取りに行くことはしません。 この区別は見た目以上に重要で、2つの状況は壊れ方が違います。
JavaScript依存のサイトをブラウザの「名前を付けて保存」で落としたファイルには、テキストがほとんど 入っていないことがあります。空のコンテナdivとバンドルスクリプトだけで、実際の中身は実行時に生成されていて ディスクには書かれていないからです。結果はほぼ空になり、変換ツールが壊れたように見えます。壊れていません。 単に言葉がファイルの中にないだけです。覚えている一文でソースを検索すれば確認できます。
そうなったときはWeb2Txtを使ってください。 生きているURLを受け取り、ページを描画してから、その結果を抽出します。このページを使うのは、 すでにファイルが手元にあるとき——メールの書き出し、ドキュメントのビルド成果物、CMSのダンプ、 HTMLとして生成されたレポート、何年も前に保存したページなどです。
よくある使い道
- 学習用・評価用コーパスの構築。保存済みページのフォルダから、素の散文を、 数千件にわたって同じ形式で揃えて取り出す。
- 可読性とコンテンツの点検。語数、読解レベル、キーワード頻度。どれも、 マークアップに数字を歪められていないテキストを必要とします。
- スクリプトに流す。プレーンテキストなら、
grepやwc、diff、 Pythonのワンライナーにエスケープの面倒なしで渡せます。 - 長いページの要約。構造はどうでもよく、トークンは中身のほうに使いたい場面です。
- HTMLファイルからのテキスト抽出。翻訳や書き起こしの作業では、 翻訳者が欲しいのは文だけで、それ以外ではありません。
よくある質問
HTMLファイルをテキストに変換するには?
上の欄に.htmlまたは.htmのファイルをドロップすれば、タグもスクリプトもスタイルブロックも取り除かれた読めるテキストが返ってきます。無料、登録不要、1ファイル50MBまで。.txtとしてダウンロードしても、マークアップではなく言葉を必要としていた先へそのままコピーしてもかまいません。
URLを貼って公開中のページを変換できますか?
このページではできません。ここが受け取るのは、すでに手元にあるファイルです。URLからならWeb2Txtがページを取得してそのまま抽出するので、保存してからアップロードする往復が省けます。このページは、以前保存したページ、書き出したメール本文、ローカルの何かが生成したHTMLに使ってください。
ナビゲーションや広告、Cookieバナーも除去されますか?
定型文の除去は、解決済みの問題ではなく既知の落とし穴です。スクリプト、スタイル、タグは必ず消えます。ただしサイドバーやCookie通知を本文と見なすかどうかは判断の問題で、保存されたページはそれらを全部同じDOMの中に抱えています。出力の先頭と末尾にざっと目を通してください。ナビゲーションの残骸が溜まるのはそこです。
ページ内のリンクはどうなりますか?
アンカーテキストは言葉として残り、その背後のURLは残りません。「インストール手順を参照」という一文はそのままの文になり、どこを指していたかの情報は消えます。リンク先が重要なら——リンクマップを作る、外部参照を点検するといった場合——HTMLをMarkdownに変換を使ってください。角かっこ記法でhrefが保たれます。
出力が空行と正体不明の文字だらけになるのはなぜ?
たいていはDOMを丸ごと保持したまま保存されたページです。非表示のテンプレートブロック、JSON-LDのペイロード、インラインSVG、解析タグの断片——どれもそのマークアップの中にいて、どれも一応テキストを含んでいます。繰り返しのパターンさえ見抜けば1行の正規表現で片づきますし、ブラウザのリーダー表示で保存し直したものを変換するのも手です。
スイートの残り
選ぶのが面倒なら、File2Txtが 対応形式すべてを1つの入力欄で処理します。目的が決まっているなら直接どうぞ。 文書ならPDFをテキストに、 DOCXならWordをテキストに、 電子書籍ならEPUBをテキストに、 区切りデータならCSVをテキストにがあります。
コードが相手ですか。GitHubをテキストに変換するツール、 GitLab変換ツール、 ローカルフォルダ変換なら、 プロジェクト全体を1つのファイルに平坦化できます。そして このガイド では、LLMに渡す前に文書をどう整えるかという、より広い話題を扱っています。
Repo2Txtを開発・運営しているのは v12hero、 プライバシー最優先のネイティブアプリとWebアプリを作る独立系デベロッパーです。