Python 開発者であれば、おそらく BeautifulSoup (別名 BS4) に精通しているでしょう。これは、XNUMX 年以上にわたって Python Web スクレイピングの定番となっている由緒ある HTML/XML 解析ライブラリです。
しかし、現在、Python で HTML を解析するためのオプションが Beautiful Soup だけではないことには気づいていないかもしれません。実際、機能とパフォーマンスの点で BS4 を上回る有能な BeautifulSoup の代替手段が驚くほどたくさんあります。
この包括的なガイドでは、Python を使用した HTML スクレイピングと解析のための最も人気があり強力な BeautifulSoup の代替手段をいくつか紹介します。
BeautifulSoup の代替品を検討する理由は何ですか?
選択肢に入る前に、そもそもなぜ代替案を検討する必要があるのかと疑問に思うかもしれません。
Python Web スクレイピング プロジェクトで BeautifulSoup 以外にも目を向けるべき理由は次のとおりです。
パフォーマンスを向上させる – 一部の新しいパーサーは、ベンチマークで BS4 を大幅に上回ります。大規模なサイトをスクレイピングする場合、速度は非常に重要です。
その他の特長 – lxml などのライブラリは、XPath サポートなどの追加機能を提供します。
HTML5 解析の向上 – BeautifulSoup は、不正な形式の最新の HTML で問題を起こすことがあります。
より簡単な API – parsel のようなライブラリは、より直感的な Python API を提供します。
マルチスレッド – 一部の代替パーサーでは、マルチスレッド解析で複数の CPU コアを利用できます。
標準への準拠 – HTML 仕様に厳密に従うパーサーが必要な場合があります。
簡単なインストール – BS4 には、特に AWS Lambda などの制限されたシステムで、インストールの問題を引き起こす可能性のある C への依存関係がいくつかあります。純粋な Python コードを使用した代替案は、より簡単にデプロイできます。
したがって、BS4 が優れた選択肢であることに変わりはありませんが、他の優れた選択肢も検討する価値があります。 Python での HTML 解析と Web スクレイピングに最適な BeautifulSoup の代替手段をいくつか見てみましょう。
lxml – 電光石火のように高速
最も人気があり強力な BeautifulSoup の代替手段の 1 つは次のとおりです。 lxmlの。 lxml ライブラリは、Python で HTML と XML を解析するための、非常に高速で機能が豊富な API を提供します。
ベンチマークでは、lxml は一貫して BeautifulSoup を大幅に上回っています。見かけることも珍しくない 10~100倍の速度向上 HTML 解析に BeautifulSoup の代わりに lxml を使用する場合。
このため、lxml は大規模なサイトをスクレイピングしたり、巨大な HTML ドキュメントを解析したりする人にとって不可欠なツールになります。速度の利点により、マークアップをより効率的に解析し、大量のスレッドのスクレイピングのコストを削減できます。
lxml の主な利点は次のとおりです。
- 驚異的な XML および HTML 解析速度
- 非常に大きなドキュメントのサポート
- XPath 1.0 による高度なクエリのサポート
- BeautifulSoup と同様の CSS セレクターのサポート
- スレッド化が容易 – lxml は GIL を解放し、マルチスレッド解析を可能にします。
- HTML5 解析のサポート
lxml の動作を確認するための簡単な例を見てみましょう。
from lxml import html
import requests
page = requests.get(‘https://en.wikipedia.org/wiki/Web_scraping‘)
tree = html.fromstring(page.content)
# Get headlines
headings = tree.xpath(‘//h1/text()|//h2/text()|//h3/text()|//h4/text()|//h5/text()|//h6/text()‘)
print(headings)
この簡単な例は、lxml の速度を示しています。Wikipedia の全ページを数ミリ秒で解析してクエリできます。
lxml について考慮すべき欠点がいくつかあります。
- BeautifulSoup よりも学習曲線が複雑です。 XPath クエリは、CSS セレクターよりも学習曲線が急になります。
- BS4 のような組み込みのエンコード検出はありません。
- BS4 のような要素の Python オブジェクト表現はありません。操作は DOM ナビゲーション API を通じて行われます。
それでも、ほとんどの実稼働 Web スクレイピングでは、lxml はツールキットの重要な部分です。速度の向上により、より多くのデータをより効率的にスクレイピングできるようになります。
パーセル – lxml、簡略化
lxml がもたらすものは気に入っているが、API が複雑すぎると感じる場合は、以下をチェックしてください。 パーセル.
Parsel は、lxml をラップし、HTML/XML からデータをスクレイピングするためのセレクターベースのインターフェイスを提供することにより、より使いやすく、より Python 的な API を提供します。
パーセルの主な利点は次のとおりです。 シンプルさと読みやすさ。 Parsel は Web スクレイピングを念頭に置いてゼロから設計されましたが、lxml はより広範囲の XML 解析機能をサポートしています。
lxml と比較して、parsel は以下を提供します。
- 簡素化された CSS セレクター式
- 自動エンコード処理
- はるかに簡単な属性およびテキスト抽出 API
- 全体的により直感的なアプローチ
たとえば、パーセル セレクターを使用してテキストと属性を抽出する方法は次のとおりです。
from parsel import Selector
html = ‘‘‘<div>
<p class="summary">Some text <a href="/ja/more">More</a></p>
</div>‘‘‘
sel = Selector(text=html)
print(sel.css(‘p::text‘).get()) # Some text More
print(sel.css(‘a::attr(href)‘).get()) # /more
Selector API は、BeautifulSoup や jQuery を使用している人にはよく知られているものです。ただし、lxml のパフォーマンス上の利点はすべて内部で得られます。
全体的なパーセルは、シンプルで直感的なスクレイピング インターフェイスが必要だが、lxml の速度や互換性の利点を犠牲にしたくない場合に優れた選択肢です。
html5lib – 標準に準拠した解析
BeautifulSoup の最もクールな代替品の 1 つは、 html5lib.
html5lib は、最新の Web ブラウザとまったく同じ方法で HTML を解析するため、独特です。これは HTML 仕様に厳密に取り組み、公式の W3C DOM 仕様に厳密に準拠したドキュメント オブジェクト モデルを出力します。
html5lib の利点は次のとおりです。
- HTML5 ブラウザーのルールに従った、忠実で準拠した HTML 解析
- 実際の不正なマークアップの適切な処理
- 純粋にPythonで実装されているため、インストールが簡単です。
- ほとんどの場合、BS4 のドロップイン代替品として機能します
- 高度にカスタマイズ可能で拡張可能
基本的な html5lib の使用法を見てみましょう。
import html5lib
html = ‘<div><span>Example</span></div>‘
parser = html5lib.HTMLParser()
dom = parser.parse(html)
print(dom.getElementsByTagName(‘span‘)[0].toxml())
# <span>Example</span>
html5lib がドキュメントから標準 DOM オブジェクトを生成することがわかります。
欠点の 5 つは、htmlXNUMXlib が lxml などよりも遅いことです。ただし、ブラウザに準拠した方法で不正なマークアップも処理できるパーサーが必要な場合には、これは素晴らしい選択肢です。
代替の Python HTML パーサー
lxml、parsel、html5lib は最も機能的な BeautifulSoup の代替手段の XNUMX つですが、他にもいくつかのオプションがあります。
- PyQuery – jQuery スタイルの DOM 操作。
- 美しいスープ4 – OG BeautifulSoup。遅いですが、非常に親しみやすい API。
- HTMLパーサー – Python の組み込み HTML パーサー。
- htmlmin – HTML を縮小する場合。
- マークアップセーフ – マークアップを Python オブジェクトとして公開する HTML/XML パーサーを実装します。
これらのライブラリは、さまざまな解析ニーズを満たします。たとえば、PyQuery は jQuery 風の DOM 操作を提供します。 BeautifulSoup4 は、そのシンプルな API により依然として人気があります。
次のような高速 HTML パーサー用の Python バインディングもあります。 グース & ジェイファスト 他の基盤となる高速解析エンジンを活用します。
直接の代替品ではありませんが、基本的な解析タスクについては、Python の組み込み HTMLParser も機能します。
重要なのは、BeautifulSoupだけに限定しないことです。利用可能な多数の解析ツールに照らしてニーズを評価します。
パーサーをベンチマークで比較する方法
パフォーマンスの違いを示すために、BeautifulSoup、lxml、html5lib、および Python の HTMLParser を使用して、いくつかの一般的な操作をベンチマークしてみましょう。
シンプルなものを作成しました ベンチマークスクリプト 3 つのタスクでさまざまなパーサーを計算します。
- 約 3KB の Wikipedia HTML ページを解析する
- すべてのリンクを見つける
- 特定の要素を見つける
私のラップトップでの結果は次のとおりです。
パーサ | 解析時間 | すべてのリンクを検索 | 要素の検索 |
---|---|---|---|
lxmlの | 3.5ms | 9ms | 0.1ms |
html5lib | 33ms | 64ms | 7ms |
美しいスープ | 12ms | 18ms | 1ms |
HTMLパーサー | 4ms | 32ms | 0.5ms |
予想どおり、lxml は非常に高速で、一部の操作では html10lib よりも 5 倍高速です。驚くべきことに、HTMLParser は基本的な解析に関しては独自の機能を備えていますが、要素をクエリするときに遅れが生じ始めます。
小さなドキュメントに関するこれらのベンチマークでは、違いが強調されます。 lxml の速度が真価を発揮する大規模な HTML ドキュメントでは、その差はさらに大きくなるでしょう。
実際の例
次に、Web スクレイピング タスクにこれらの代替パーサーを使用した実際の例をいくつか見てみましょう。
lxml を使用した製品リストのスクレイピング
ここでは、e コマース サイトからいくつかの商品リストをスクレイピングします。 Lxml は、必要なデータを素早く抽出します。
from lxml import html
import requests
page = requests.get(‘https://myshop.com/products‘)
doc = html.fromstring(page.content)
# Extract product listings
products = doc.xpath(‘//div[@class="product"]‘)
for product in products:
name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
price = product.xpath(‘.//span[@class="price"]/text()‘)[0]
print(name, price)
lxml を使用すると、大きな HTML ドキュメントでも迅速に解析し、簡潔な XPath クエリを使用して必要なデータを抽出できます。
pandas と html5lib を使用したテーブルのスクレイピング
HTML テーブルを pandas DataFrame にスクレイピングする必要があるとします。 HTML5lib はテーブルを確実に解析します。
import html5lib
import pandas as pd
html = ‘‘‘<table>
<tr>
<th>Name</th>
<th>Age</th>
</tr>
<tr>
<td>John</td>
<td>30</td>
</tr>
<tr>
<td>Jane</td>
<td>32</td>
</tr>
</table>‘‘‘
parser = html5lib.HTMLParser()
dom = parser.parse(html)
rows = []
for tr in dom.getElementsByTagName(‘tr‘):
rows.append([td.text for td in tr.getElementsByTagName(‘td‘)])
df = pd.DataFrame(rows[1:], columns=rows[0])
print(df)
# Name Age
# 0 John 30
# 1 Jane 32
Html5lib は標準に準拠しているため、問題のあるマークアップでもテーブル スクレイピングが一貫して機能することが保証されます。
パーセルを使用してテキストをスクレイピングする
テキストの多いページの場合、パーセルを使用すると抽出が簡単になります。
from parsel import Selector
html = ‘‘‘<div>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</div>‘‘‘
sel = Selector(text=html)
content = sel.xpath(‘//div//text()‘).getall()
print(content)
# [‘Paragraph 1‘, ‘Paragraph 2‘]
Parsel は、BeautifulSoup のシンプルさと lxml の速度を組み合わせたものを提供します。
HTML 解析ライブラリを選択する基準
これらの BeautifulSoup の代替案をすべて評価するとき、プロジェクトにとって最も重要な基準は何ですか?
速度 – パフォーマンスが重要な場合、lxml に勝るものはありません。
正しさ – 問題のあるページを確実に解析するには、html5lib が最適です。
フィーチャセット – Lxml は、より完全な DOM ナビゲーションと XPath サポートを提供します。
使い慣れた API – BeautifulSoup の CSS セレクターは学ぶのが最も簡単です。
不正なマークアップの処理 – Lxml と html5lib は、実際の HTML をより堅牢に処理します。
規格への適合 – Html5lib は、HTML5 ブラウザーの動作に最も厳密に準拠しています。
使いやすさ – Parsel と PyQuery は、最も単純なスクレイピング API を提供します。
すべてのシナリオに最適な単一のパーサーはありません。特定の要件とユースケースを分析して、何が最適かを決定します。
多くの場合、ライブラリを組み合わせて使用するのが最適です。たとえば、解析には html5lib を使用し、クエリには lxml を使用します。サンプル ページでさまざまなオプションをテストして、特定の Web スクレイピング ニーズに適切かつ確実に機能するものを感じてください。
Webスクレイピングのためのパーサーレス化
ここでは HTML 解析ライブラリに焦点を当ててきました。ただし、解析アプローチ全体に代わる代替手段があることは注目に値します。
以下を使用すると、HTML パーサーを使用せずにデータをスクレイピングすることができます。
- 正規表現 – 正規表現を使用して、生の HTML をパターン マッチし、データを抽出できます。脆いですが、単純な場合には機能する場合もあります。
- 文字列操作 – Python 文字列メソッドを使用して、HTML 文字列を検索、分割、スライスします。
- HTTPリクエスト – API に直接リクエストを送信し、API 応答を収集します。
- ブラウザの自動化 – Selenium などのツールを活用して、レンダリングされた JavaScript コンテンツをスクレイピングします。
- JSON/XMLなどの形式に変換 – HTML の代わりに構造化データ フィードをスクレイピングします。
これらのアプローチは役立つ場合もありますが、通常、特に複雑なサイトでは拡張性がなく、確実に機能しません。一般に、堅牢性を確保するために HTML 解析ライブラリが推奨されます。
ただし、ページが非常に単純である場合、または JS レンダリングが必要な場合は、パーサーを使用しないアプローチで十分な場合があります。
主要な取り組み
Beautiful Soup は多くの一般的な HTML 解析ニーズを解決しますが、lxml、parsel、html5lib などの代替手段も検討する価値があります。
Lxml – スピードとパフォーマンスのゴールドスタンダード。実稼働規模の Web スクレイピングに最適です。
小包 – 簡単にスクレイピングできるシンプルな API。 lxml の速度に基づいて構築されています。
html5lib – 精度と標準準拠のためのブラウザ準拠の解析。
ベンチマーク – Lxml は、一部の操作において html100lib よりも最大 5 倍高速です。
基準 – 速度、読みやすさ、正確さ。ユースケースに応じてトレードオフを評価します。
パーサーなし – 単純なケースでは、正規表現/文字列操作が機能する可能性があります。
BeautifulSoup だけに限定しないでください。Python エコシステムは、驚くほど多様な HTML 解析機能を提供します。それぞれの作業に適したツールを活用しましょう。