コンテンツにスキップ

Python で HTML をテキストに変換するにはどうすればよいですか?

これは、「Python で HTML をテキストに変換する方法?」に関する 2000 ワード以上のブログ投稿です。

HTML は、Web 上でデータを保存および表示するための重要な形式です。 Web スクレイピングでは、HTML ページから表示されているテキスト コンテンツだけを抽出したいことがよくあります。この投稿では、Python で HTML をクリーン テキストに変換するためのさまざまなテクニックを検討します。

HTML をテキストに変換する理由

HTML タグを削除してテキストだけを抽出する主な理由は次のとおりです。

  • スクレイピングされたコンテンツを簡素化する – Web ページをスクレイピングする場合、HTML には通常、ナビゲーション リンクなどの不要なマークアップや要素が多数含まれます。メインテキストを抽出すると、コンテンツの分析と作業が容易になります。

  • 書式設定を削除する – HTML は視覚的な書式設定とレイアウトを適用します。感情分析などの多くのアプリケーションでは、書式設定を行わないテキスト コンテンツだけが必要です。

  • テキスト形式で保存する – HTML からテキストだけを抽出して、テキスト ファイルやデータベースのテキスト フィールドなどの単純な形式で保存できると便利です。これにより、かさばる HTML マークアップがすべて削除されます。

  • 読みやすさ – 生の HTML は人間にとって読み取って解釈するのが困難です。テキストに変換すると読みやすくなります。

  • ユーザー補助 – プレーン テキスト コンテンツは、視覚障害のあるユーザーが使用するスクリーン リーダーにとってアクセスしやすくなります。

  • 検索エンジンインデックス化 – 検索エンジンは主に、ページに表示されているテキスト コンテンツを分析してインデックスを付けます。 HTML をテキストに変換すると、検索エンジンがコンテンツを認識するのと同じようにコンテンツを分析できます。

要約すると、HTML からテキストを抽出することは、スクレイピング、分析、保存、アクセシビリティに役立ちます。次のセクションでは、Python でこれを実現するさまざまな方法について説明します。

BeautifulSoup を使用して HTML タグを削除する

Beautiful Soup は、Web スクレイピングと HTML 解析用の人気のある Python ライブラリです。これを使用すると、HTML からテキストを非常に簡単に抽出できます。

最も簡単な方法は、 get_text() BeautifulSoup オブジェクトまたは解析された HTML から選択された要素のいずれかのメソッド。例えば:

from bs4 import BeautifulSoup

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>."""

soup = BeautifulSoup(html, "html.parser")

text = soup.get_text()
print(text)

# Output: Here is a paragraph with a link.

これにより、すべての HTML タグが削除され、表示されるテキストを含む文字列が返されます。

注意すべき点の1つは、 get_text() デフォルトでは、複数の連続する空白文字も 1 つのスペースに圧縮されます。合格 strip=False 改行や余分なスペースなどの空白を保持するには:

text = soup.get_text(strip=False) 
print(text)

# Output: 
# 
# Here is a paragraph with  
#            a link.

HTML の一部のみからテキストを抽出するには、次のメソッドを呼び出します。 get_text() ドキュメント全体ではなく要素に対して:

el = soup.select_one("p")
text = el.get_text()
print(text)

# Output: Here is a paragraph with a link.

1 つの注意点は、 get_text() リンクなどの子要素内にネストされたテキストは引き続き含まれます。それらも削除するには、 recursive=False 引数:

text = el.get_text(recursive=False)
print(text) 

# Output: Here is a paragraph with 

BeautifulSoup を使用すると、簡単に使用できます get_text() HTML から表示テキストを抽出します。

lxmlでテキストを抽出する

lxmlの は、XML と HTML を解析するためのもう 1 つの人気のある Python ライブラリです。テキストの抽出にも使用できます。

lxmlから HTMLParser 要素を呼び出します。 text_content() テキストを取得するメソッド:

from lxml.html import fromstring, HTMLParser

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

tree = fromstring(html, parser=HTMLParser())

text = tree.text_content() 
print(text)

# Output: Here is a paragraph with a link.

これにより、子要素を含むすべてのテキストが再帰的に抽出されます。子からのテキストを除外するには、 children=False 引数:

text = tree.text_content(children=False)
print(text)

# Output: Here is a paragraph with 

したがって、lxml は、HTML を削除してテキスト コンテンツだけを取得する簡単な方法も提供します。

正規表現

正規表現ベースのアプローチを使用して HTML タグを削除することもできます。これには、すべての HTML タグと一致するパターンの使用と、タグを何も置き換えない置換が含まれます。

import re

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

clean = re.sub(r"<[^>]*>", "", html) 
print(clean)

# Output: Here is a paragraph with a link.

正規表現 r"<[^>]*>" マッチ < その後に次以外のものが続く > 1 回以上、その後に >を選択します。 re.sub() call はこれらの一致を削除し、事実上すべての HTML タグを削除します。

XML 名前空間と自己終了タグも扱うには:

clean = re.sub(r"<[^>]+>", "", html)

これは、すべての HTML タグを削除するための、迅速かつ簡単な正規表現ベースのアプローチです。ただし、BeautifulSoup や lxml などの特定の HTML 解析ライブラリと同じ制御性とシンプルさは提供されません。

エンコーディングの処理

Web ページは、ASCII、UTF-8、ISO-8859-1 などのさまざまなテキスト形式でエンコードできます。ページをスクレイピングするときは、エンコードを検出し、Unicode テキストに適切にデコードする必要があります。

  chardet ライブラリはエンコーディングを自動的に検出できます。

import chardet

html = b"<p>Hello world</p>"

encoding = chardet.detect(html)["encoding"]

if encoding:
    html = html.decode(encoding)
else:
    html = html.decode("utf-8") 

print(html)

その後、テキストを解析して抽出する前に、HTML バイトを Unicode 文字列に明示的にデコードできます。

HTML をテキストに変換する場合、エンコード エラーを避けるために、解析を行う前にエンコードを最初に処理する必要があります。

完全な HTML をテキストに変換する例

以下は、HTML からテキストを確実に抽出するためにカバーされている手順をまとめた例です。

from bs4 import BeautifulSoup
import chardet
import re

def html_to_text(html):
    # Detect encoding
    encoding = chardet.detect(html)["encoding"] 

    if encoding:
        html = html.decode(encoding)
    else:
        html = html.decode("utf-8")

    # Remove tags
    clean = re.sub(r"<[^>]+>", "", html)

    # Extract text
    soup = BeautifulSoup(clean, "html.parser")
    text = soup.get_text(strip=True)

    return text

html = """<p>Here is a paragraph with <a href="http://example.com">a link</a>.</p>"""

print(html_to_text(html))

# Output: Here is a paragraph with a link.

これは、再利用可能な関数でエンコードの検出、タグの除去、およびテキストの抽出を処理します。

のようなPythonライブラリもあります テクスト これは、さまざまなファイル形式をテキストに変換するためのこの機能の一部をカプセル化します。

HTMLエンティティの変換

私たちが遭遇する可能性のあるもう 1 つの問題は、次のような文字エンティティを使用する HTML です。   および & リテラル文字の代わりに。

使用できます html.unescape() Python標準の関数 htmlライブラリ エンティティを文字に変換するには:

import html

text = " Bread & Butter"

print(html.unescape(text))

# Output: Bread & Butter 

これは、HTML からテキストを抽出する前または後に実行できます。

JavaScriptの処理

上記の手法の制限は、最初の HTML から表示可能なテキストのみを抽出することです。 JavaScript によって動的に追加されたテキストはキャプチャされません。

JavaScript を実行して全文を表示するには、次のようなヘッドレス ブラウザを使用する必要があります。 Selenium or 劇作家:

from playwright.sync_api import sync_playwright

html = """<p>Hello</p><script>document.body.innerHTML += "<p>World</p>";</script>"""

with sync_playwright() as p:
    browser = p.webkit.launch()
    page = browser.new_page()
    page.content = html
    text = page.content()
    browser.close()

print(text)    
# Output: <p>Hello</p><p>World</p>

ここでは、Playwright を使用してページをロードし、JavaScript を実行して、完全なテキストを抽出できるようにしています。

そのため、大量の JS 操作を含むページで、レンダリングされたテキスト全体が必要な場合は、ブラウザー自動化ツールが必要になる場合があります。

まとめ

Python で HTML をプレーン テキストに変換するには、主な手法がいくつかあります。

  •   get_text() ビューティフルスープより
  • コンテンツを抽出する text_content() lxmlで
  • 正規表現を使用してタグを削除する
  • 解析する前にエンコードをデコードする
  • HTML エンティティを処理する html.unescape()
  • JavaScriptを実行する必要がある場合はヘッドレスブラウザを使用してください

HTML からテキストへの変換は、スクレイピングされたコンテンツの簡素化、マークアップの代わりにテキストの分析、読みやすさとアクセシビリティの向上、検索エンジンによるインデックス作成、軽量形式での保存に役立ちます。

この投稿が、Python を使用して HTML からテキストを抽出する主な方法についての包括的なガイドを提供できれば幸いです。他に便利なテクニックがあれば教えてください。

参加する

あなたのメールアドレスは公開されません。 必須フィールドは、マークされています *