1. 背景と目的
Web ページからテキストを抽出しただけでは、行頭・行末の改行や全角/半角スペース、広告由来の不要文字列などが混在し、そのままでは機械処理もしづらく読みづらいことが多々あります。Beautiful Soup で取得したテキストを strip 系メソッドと 正規表現 (re) を組み合わせて整形すると、不要な空白・制御文字・パターンを効率よく除去できます。
2. 余分な空白を除去する strip 系メソッド
| メソッド | 説明 | 典型的な用途 |
|---|---|---|
str.strip() |
先頭・末尾の空白文字(\n, \t, 半角/全角スペースなど)を除去 |
基本的な前後トリム |
str.lstrip() |
先頭だけをトリム | 番号付き見出しの前の空白を削る |
str.rstrip() |
末尾だけをトリム | 各行末の改行やスペースを削る |
get_text(strip=True) も同様に先頭・末尾の空白を自動トリムします。
3. Beautiful Soup と正規表現の併用パターン
3.1 行中の複数空白/改行を 1 つへ削減
-
\s+は連続する空白・改行・タブを一括検出 -
日本語文章では改行位置が任意の場合に便利
3.2 HTML エンティティや広告タグ残渣の除去
3.3 特定タグ配下のみ一括クリーニング
-
元の DOM を保ちつつテキストを更新できる
4. strip と re を組み合わせるベストプラクティス
-
段階的に処理
-
get_text(strip=True)で外側の空白を刈り取る -
正規表現で行中の冗長表記を正規化
-
-
処理対象を限定するセレクタ
広告・サイドバーを事前にsoup.select_one('#ad').decompose()などで削除すると正規表現がシンプルになる -
Unicode 正規化
import unicodedata; text = unicodedata.normalize('NFKC', text)で全角英数を半角へ統一してから正規表現を当てる -
コンパイル済みパターンの再利用
頻出パターンはre.compileしてループ内で使い回すと高速
5. よくある落とし穴と対策
| 症状 | 原因 | 解決策 |
|---|---|---|
が消えない |
取り込み時に非破壊スペース (U+00A0) へ変換 | re.sub('\u00a0', ' ', text) を追加 |
| 句読点直前の空白が残る | \s+ で統一後に ' 、'などが生じる |
re.sub(r'\s+([、。])', r'\1', text) |
| 日本語と英語の間隔が詰まる | 全削除し過ぎ | pangu など日本語用スペース調整ライブラリを併用 |
| HTML コメントが混入 | soup.get_text() はコメントも拾う |
for c in soup(text=lambda t: isinstance(t, Comment)): c.extract() で事前除去 |
6. まとめ
-
strip 系メソッドは 前後の不要空白 を手軽に除去
-
正規表現は 行中のパターン置換 に強力
-
Beautiful Soup のセレクタで 対象範囲を絞り込む と処理が安定
-
日本語 Web では 全角/半角・改行規則 を意識した追加正規化が重要
これらのテクニックを組み合わせることで、スクレイピング後のテキストを高品質に整形でき、後続の自然言語処理やデータ解析をスムーズに進められます。
ChatGPT4o 生成日:2025/06/19