テキストの整形(strip、正規表現との併用)

1. 背景と目的

Web ページからテキストを抽出しただけでは、行頭・行末の改行や全角/半角スペース、広告由来の不要文字列などが混在し、そのままでは機械処理もしづらく読みづらいことが多々あります。Beautiful Soup で取得したテキストを strip 系メソッド正規表現 (re) を組み合わせて整形すると、不要な空白・制御文字・パターンを効率よく除去できます。


2. 余分な空白を除去する strip 系メソッド

メソッド 説明 典型的な用途
str.strip() 先頭・末尾の空白文字(\n, \t, 半角/全角スペースなど)を除去 基本的な前後トリム
str.lstrip() 先頭だけをトリム 番号付き見出しの前の空白を削る
str.rstrip() 末尾だけをトリム 各行末の改行やスペースを削る
python
from bs4 import BeautifulSoup html = '<p> \n こんにちは <br/> 世界 \t </p>' text = BeautifulSoup(html, 'html.parser').get_text() print(text.strip()) # -> 'こんにちは \n 世界'

get_text(strip=True) も同様に先頭・末尾の空白を自動トリムします。


3. Beautiful Soup と正規表現の併用パターン

3.1 行中の複数空白/改行を 1 つへ削減

python
import re normalized = re.sub(r'\s+', ' ', text.strip())
  • \s+ は連続する空白・改行・タブを一括検出

  • 日本語文章では改行位置が任意の場合に便利

3.2 HTML エンティティや広告タグ残渣の除去

python
pattern = re.compile(r'(Sponsored|広告|\u00a0)') # &nbsp; は U+00A0 cleaned = pattern.sub('', normalized)

3.3 特定タグ配下のみ一括クリーニング

python
for p in soup.select('article p'): p.string = re.sub(r'\s+', ' ', p.get_text(strip=True))
  • 元の DOM を保ちつつテキストを更新できる


4. strip と re を組み合わせるベストプラクティス

  1. 段階的に処理

    1. get_text(strip=True) で外側の空白を刈り取る

    2. 正規表現で行中の冗長表記を正規化

  2. 処理対象を限定するセレクタ
    広告・サイドバーを事前に soup.select_one('#ad').decompose() などで削除すると正規表現がシンプルになる

  3. Unicode 正規化
    import unicodedata; text = unicodedata.normalize('NFKC', text) で全角英数を半角へ統一してから正規表現を当てる

  4. コンパイル済みパターンの再利用
    頻出パターンは re.compile してループ内で使い回すと高速


5. よくある落とし穴と対策

症状 原因 解決策
&nbsp; が消えない 取り込み時に非破壊スペース (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