最高のPython HTMLパーサー一覧

ウェブスクレイピングプロジェクトを簡素化・高速化するトップクラスのPython HTMLパーサー——Beautiful Soup、HTMLParser、lxml、PyQuery、Scrapy——をご紹介します。
3 分読

Pythonは、利用可能なHTMLパーサーの数が多いことから、ウェブスクレイピングに人気の選択肢です。この記事では、最も広く使用されているパーサーであるBeautiful SoupHTMLParserlxmlPyQueryScrapyについて探求します。これらのパーサーは、使いやすさ、速度、最新のHTML標準への対応、ドキュメント、コミュニティサポートから支持されています。

さっそく始めましょう!

Beautiful Soup

Beautiful Soupは、HTMLおよびXMLドキュメントをパースするためのPythonライブラリです。各ページの構造を反映したパースツリーを作成し、データの自動抽出を容易にします。このツリーはドキュメント内の要素の階層構造を表しており、特定のノードを効率的に検索・ナビゲートすることを可能にします。

特徴と使いやすさ

Beautiful SoupはHTML文書を構造化された情報に整理するのに有用です。標準HTML、不正なHTML、XHTML、HTML5、XMLなど様々なマークアップを扱うためのhtml.parserlxmlhtml5libといった複数のパーサーを備えています。これにより速度と精度の最適なバランスを選択する柔軟性が得られます。 たとえば、タグが欠落していたり要素のネストが不適切なウェブページを扱う場合、html5libを使用すればウェブブラウザと同様に HTML コンテンツをパースできます。

また、HTML構造が予測不可能または無秩序なウェブスクレイピング作業においても、Beautiful Soupが役立ちます。 ドキュメントがパースされたら、ツリー内を簡単に検索してノードを特定できます。find()find_all()select()などの検索メソッドは、識別子、クラス、テキストコンテンツ、属性に基づいて要素にアクセスする手段を提供します。タグの全インスタンスを検索する場合でも、特定の要素をターゲットにする場合でも、適切なセレクタを使用することで、最小限のコーディング作業で必要なデータに素早くアクセスできます。

速度

Beautiful Soupは最速のパースではありませんが、柔軟なパース戦略により適応性を提供します。デフォルトではPythonのhtml.parserを使用しており、ブログ記事からデータを抽出するといった小規模な文書処理などの単純なタスクに最適です。大量のデータをスクレイピングして処理したい場合は、別のパーサーの使用を検討してください。

最新のHTML標準への対応

静的ウェブページからHTML5要素や属性を分析したい場合、Beautiful Soupは優れた選択肢です。パーサーとの互換性により、最新のHTML標準への準拠が保証されます。

ドキュメントとサポート

Beautiful Soupには充実したドキュメントがあり、GitHubでは85万人以上のユーザーが利用しています。ドキュメントには例、チュートリアル、リファレンスが用意されており、簡単に始められます。

Beautiful Soup を使ったウェブスクレイピングの詳細はこちら

コード例

Beautiful Soupをインストールするには、シェルまたはターミナルで次のコマンドを実行します:

pip3 install beautifulsoup4

以下のコードスニペットは、Beautiful Soupを使用してBooks to Scrapeウェブサイトからデータをパースします:

import requests
from bs4 import BeautifulSoup

# スクレイピング対象のウェブページのURL
books_page_url = "https://books.toscrape.com/"

# ウェブページのコンテンツを取得
response = requests.get(books_page_url)

# リクエストが成功したか確認
if response.status_code == 200:
    # ページのHTMLコンテンツをパース
    soup_parser = BeautifulSoup(response.text, 'html.parser')

    # 書籍情報を含む全記事を検索
    book_articles = soup_parser.find_all('article', class_='product_pod')

    # 各書籍記事のタイトルと価格を抽出
    for book_article in book_articles:
        # 書籍のタイトルを抽出
        book_name = book_article.h3.a['title']
        
        # 書籍の価格を抽出
        book_cost = book_article.find('p', class_='price_color').text
        
        # 書籍のタイトルと価格を出力
        print(f"タイトル: {book_name}, 価格: {book_cost}")
else:
    # ページを取得できなかった場合のエラーメッセージを出力
    print("ウェブページの取得に失敗しました")

このコードを試したい場合は、beautifulsoup_books_scrape.py というファイルに保存し、以下のコマンドで実行してください:

python3 beautifulsoup_books_scrape.py

ターミナルまたはシェルに、最初のページから取得した書籍のタイトルと価格がすべて表示されるはずです:

…出力省略…
タイトル: Soumission, 価格:  £50.10
タイトル: Sharp Objects, 価格:  £47.82
タイトル: Sapiens: A Brief History of Humankind, 価格: £54.23
タイトル: The Requiem Red, 価格: £22.65
タイトル: The Dirty Little Secrets of Getting Your Dream Job, 価格: £33.34
…出力省略…

ウェブスクレイピングが初めての方には、Beautiful SoupのシンプルさとHTMLツリーを操作する能力が、ウェブスクレイピングプロジェクトに最適な選択肢となります。

HTMLParser

HTMLParserはPythonにプリインストールされているライブラリで、HTML文書からデータをパース・抽出できます。

機能と使いやすさ

lxmlやhtml5libなどの他のパースライブラリが提供する機能の一部はHTMLParserにはありませんが、そのシンプルさとPythonとの統合性により、HTMLコンテンツが一貫している(例:静的なウェブページのスクレイピング)単純なデータ構造のプロジェクトに適しています。ただし、不正なHTMLコンテンツを扱う場合には、HTMLParserは最適な選択肢ではありません。

速度

HTMLParserの速度は、小規模から中規模の文書(数キロバイトから数メガバイト程度)で事前処理が最小限のHTMLパース用途には十分です。ただし、より複雑なHTML文書を扱う場合は、lxmlなどのパーサーの使用が推奨されます。

最新のHTML標準への対応

HTMLParserは基本的なHTMLパースをサポートしますが、非常に複雑なHTMLや不正なHTML文書では処理が困難になる場合があります。さらに、最新のHTML5標準を完全にサポートしているわけではありません。

ドキュメントとサポート

HTMLParserはPythonライブラリの一部であるため、信頼性の高いドキュメントとサポートが提供されています。Stack Overflow、GitHub、Python関連のフォーラムなどのプラットフォームを通じて、簡単にヘルプを見つけることができます。

コード例

前述の通り、HTMLParserモジュールはPython標準ライブラリに含まれており、追加のインストールは不要です。

以下はhtml.parserを使用してHTMLデータをパースするコード例です:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("開始タグを検出:", tag)
        
    def handle_endtag(self, tag):
        print("終了タグを検出:", tag)
        
    def handle_data(self, data):
        print("データを検出:", data)

parser = MyHTMLParser()

html_data = """
<html>
  <head><title>Example</title></head>
  <body><h1>見出し</h1><p>段落です。</p></body>
</html>
"""

parser.feed(html_data)

このスクリプトでは、HTMLParserクラスを拡張して、開始タグ、終了タグ、および各要素の表示を管理するHTMLパーサーを作成します。

このコードを使用するには、htmlparser_example.py というファイルに保存し、ターミナルまたはシェルから次のコマンドで実行します:

python3 htmlparser_example.py

出力には各タグとデータが表示されます:

…出力省略…
開始タグを検出: html
データを検出:  
  
開始タグを検出: head
開始タグを検出: title
データを検出:  Example
終了タグを検出: title
終了タグを検出: head
…出力省略…

lxml

lxmlは、組み込みXMLライブラリの機能とPythonの使いやすさを兼ね備えているため、ウェブスクレイピングやデータ抽出で広く採用されています。

機能と使いやすさ

lxmlは、HTMLおよびXMLドキュメントのナビゲーションと分析のための効率的で多目的な機能により人気を博しています。XPathXSLT、XPointerを含む高度なXML処理機能を提供し、データを正確に抽出・変換することを可能にします。

Beautiful Soupと同様に、lxmlはツリー構造をサポートしているため、HTMLコンテンツのナビゲーションとパースが容易です。多様なコンテンツを扱う場合、フォーマットされた文書と不適切なフォーマットの文書の両方でうまく機能するその能力が役立つでしょう。

速度

lxmllibxml2やlibxsltといったCライブラリを活用しているため、その速度と効率性でよく知られています。これにより、特に大規模なHTMLテーブルから深くネストされたデータを抽出するといった複雑なパースタスクや、膨大なドキュメントを扱う場合において、他のパースライブラリよりも高速に動作します。

lxmlは、納期が厳しいプロジェクトや大量のデータを処理する必要があるプロジェクトに最適です。

最新のHTML標準への対応

lxml は HTML5 ファイルや構造化されていない HTML を含む最新のウェブ技術に対応しています。HTML の品質や構造が不安定なウェブスクレイピング作業において、lxml は最適な選択肢の一つです。

ドキュメントとサポート

lxmlは、あらゆるレベルの開発者に対応した詳細な例を含む包括的なドキュメントを備えています。さらに、Stack OverflowやGitHubなどのプラットフォームで、より多くの情報、トラブルシューティングのヒント、ベストプラクティスを探すことができます。

lxml によるウェブスクレイピングの詳細はこちらをご覧ください

コード例

lxmlをインストールするには、以下を実行してください:

pip3 install lxml

以下の例は、lxmlでHTMLデータをパースする方法を示しています:

from lxml import html

html_content = """
<html>
  <body>
    <h1>Hello, world!</h1>
    <p>This is a paragraph.</p>
  </body>
</html>
"""

tree = html.fromstring(html_content)

h1_text = tree.xpath('//h1/text()')[0]
print("H1テキスト:", h1_text)

p_text = tree.xpath('//p/text()')[0]
print("段落テキスト:", p_text)

ここでは、lxmlを使用してHTMLコンテンツをパースし、XPath式でHTML要素からテキストを抽出しています。

lxmlを試したい場合は、このコードをlxml_example.pyというファイルに保存し、シェルまたはターミナルから次のコマンドで実行してください:

python3 lxml_example.py

すると、<h1>要素と<p>要素のテキストが以下のように出力されます:

H1 text: Hello, world!
Paragraph text: This is a paragraph.

XPathクエリの複雑性(XML内のタイプや複数アイテムなど)に対応できる本格的な本番環境向けパーサーが必要な場合は、lxmlを使用すべきです。

PyQuery

PyQuery は、Python 用のjQuery のようなライブラリで、ウェブページ全体を数秒でスクレイピングすることを可能にします。

機能と使いやすさ

jQueryの構文に似ているため、PyQueryはユーザーフレンドリーです。要素の選択、ループ処理、コンテンツの更新、HTML属性の管理を簡単に行えます。これは、HTMLページからデータを抽出して処理するウェブスクレイピングなどのタスクにおいて特に有用です。

PyQuery は CSS セレクタもサポートしているため、jQuery を使用した DOM ドキュメントのアニメーション操作に慣れている方なら、簡単に使い始めることができます。

速度

PyQueryはHTMLパースにlxmlライブラリを使用します。これにより使いやすさは増しますが、lxmlを直接使用する場合よりも処理速度は低下します。

最新のHTML標準への対応

PyQueryは最新のHTML5標準に準拠しており、lxmlをパースに使用するため、構造化HTMLと非構造化HTMLの両方を処理できます。

ドキュメントとサポート

PyQueryは、すぐに使い始められるよう、詳細なドキュメントを提供しています。他のライブラリに比べるとコミュニティは小さいですが、40人以上の貢献者によって積極的にサポートされています。また、オンラインフォーラム、Stack Overflow、様々なチュートリアルなど、問題が発生した際に役立つその他のリソースも利用できます。

コード例

PyQueryをインストールするには、以下を実行します:

pip3 install pyquery

以下はPyQueryを使用してHTMLデータをパースするコードスニペットです:

from pyquery import PyQuery as pq

html_content = """
<html>
  <body>
    <h1>Hello, from PyQuery!</h1>
    <p>This is a paragraph.</p>
  </body>
</html>
"""

doc = pq(html_content)

h1_text = doc('h1').text()
print("H1テキスト:", h1_text)

p_text = doc('p').text()
print("段落テキスト:", p_text)

このスニペットでは、HTMLコンテンツをパースし、特定の要素からテキストを抽出します。

このコードをpyquery_example.pyというファイルに保存し、シェルまたはターミナルから次のコマンドで実行します:

python3 pyquery_example.py

出力は次のようになります:

H1 text: Hello, from PyQuery!
Paragraph text: This is a paragraph.

jQueryの使用経験があり、同様の機能を探しているなら、PyQueryは最適な選択肢です。

Scrapy

Scrapyは柔軟なオープンソースのウェブスクレイピングフレームワークで、ユーザーが情報を収集するためのスパイダーを構築・運用できるようにします。HTTPリクエストの管理から、パース、処理、そして保存に至るまで、スクレイピングタスクのあらゆる側面を扱うツールを提供します。このフレームワークはスクレイピングタスクに伴う複雑な処理をすべて管理するため、ユーザーは必要な情報の収集に集中できます。

特徴と使いやすさ

Scrapyは使いやすさを重視して設計されており、モジュール式のフレームワークで複雑なウェブデータのパースに優れています。HTMLやXMLをナビゲートするためのXPathやCSSセレクタを提供し、大規模ウェブスクレイピングに不可欠なリクエストスロットリング、ユーザーエージェント偽装、IPローテーションなどのユーティリティも備えています。

速度

Scrapyは効率的です。そのネットワーク機能により、リクエストを並行処理してデータ取得を実行できます。これは大規模なデータセットを扱う場合や、商用ウェブサイトをスクレイピングしたい場合に特に威力を発揮します。

最新のHTML標準への対応

ScrapyはHTML5標準をサポートし、動的に生成されるJavaScriptを含む複雑なウェブサイトにも対応可能です。Scrapy自体はJavaScriptを処理しませんが、Seleniumなどのツールと連携してJavaScriptページを管理します。

動的コンテンツのスクレイピング方法の詳細はこちらをご覧ください。

ドキュメントとサポート

Scrapyには豊富なドキュメントと活発なコミュニティが支えとなっています。公式ドキュメントは基本操作から高度なトピックまで網羅し、あらゆるレベルの開発者をサポートする豊富な例、ガイド、推奨プラクティスを提供しています。

さらに、Scrapy コミュニティはフォーラムや GitHub リポジトリを通じて積極的に活動しており、問題が発生した際に支援を求めたり、リソースにアクセスしたりすることができます。

コード例

Scrapyをインストールするには、以下を実行してください:

pip3 install scrapy

以下はScrapyスパイダーを使用したデータ抽出の例です:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }

このスクリプトはスパイダークラスを定義し、開始URLを設定し、レスポンスのパースによりデータを抽出する方法を指定します。

このコードをquotes_spider.py というファイルに保存し、ターミナルまたはシェルから以下のコマンドで実行します:

scrapy runspider quotes_spider.py -o quotes.json

このコードを実行すると、Scrapyは「Quotes to Scrape」ページをクロールし、該当ページから引用文とその著者・タグを抽出してパースします。その後、Scrapyはスクレイピングしたデータをquotes.jsonファイルに保存します。その内容は以下のようになります:

[
{"text": "u201c私たちが作り出した世界は、私たちの思考の産物である。思考を変えずに世界を変えることはできない。u201d", "author": "Albert Einstein", "tags": ["change", "deep-thoughts", "thinking", "world"]},
{"text": "u201cハリー、我々の真の姿を示すのは能力よりも、選択そのものなのだ。u201d", "author": "J.K. Rowling", "tags": ["abilities", "choices"]}
…出力省略...
]

特定のニーズがある複雑なウェブ抽出プロジェクトでは、機能豊富なツールとスケーラビリティを備えたScrapyが優れた選択肢です。

結論

本記事では、Beautiful Soup、HTMLParser、lxml、PyQuery、Scrapyを含む5つのPython用HTMLパーサーについて解説しました。

Beautiful Soupはシンプルさから初心者向けです。HTMLParserは基本的なパースニーズ向けの軽量オプションです。lxmlはより高いパフォーマンスとXPathサポートを求める場合に検討すべき選択肢です。PyQueryはjQueryのような簡便さをPythonにもたらします。大規模なスクレイピングプロジェクトに取り組むならScrapyが最適なフレームワークです。

スクレイピングを省略してデータを直接入手したいですか? 登録して当社のデータセットを確認し、今すぐ無料サンプルをダウンロードしてください。