Parselを使ったPythonによるWeb解析入門

パイソン, 01月03日-2025年5分で読める

Webスクレイピングは、Python開発者、データサイエンティスト、Webスクレイピング愛好家にとって必須のスキルとなっています。分析のためにデータを抽出するにしても、価格比較ツールを構築するにしても、コンテンツ抽出を自動化するにしても、ウェブ解析はこれらのタスクの中核にあります。しかし、ウェブ解析が効率的で初心者に優しいのはなぜでしょうか?ParselはHTMLの解析とデータ抽出を簡素化するPythonの強力なライブラリです。

パーセル入門

ウェブ解析とは何か、なぜ重要なのか?

ParselはHTML/XMLの解析とデータ抽出のために設計された軽量なPythonライブラリです。Webスクレイピングを念頭に構築されたParselは、XPathや CSSのような強力なセレクタを使用して、Webページの構造を簡単に操作できます。これらのツールにより、ウェブページから特定の要素や属性を正確に探し出し、抽出することができます。ParselはPythonのエコシステムと統合されているため、Webコンテンツを取得するための`requests`や`httpx`のようなライブラリとシームレスに動作します。

パーセルの主な特徴

  • セレクタのサポート: 詳細なパスナビゲーションにはXPathを、よりシンプルな構文にはCSSセレクタを使用します。
  • 柔軟性:単純なテキスト抽出から深いネスト要素の処理まで、複数のHTML/XML解析タスクをサポートします。
  • スケーラビリティ:Parselはループ構造によって単一ページまたは複数ページからデータを抽出できる。
  • Scrapyとの統合:Parselの互換性は、人気のあるWebスクレイピングフレームワークであるScrapyにも自然に拡張されます。

一般的な使用例

  • ウェブスクレイピング:価格監視のために電子商取引のウェブサイトからデータを抽出する。
  • データマイニング: 公的記録から連絡先情報や調査データを収集すること。
  • 自動化:製品仕様書のダウンロードのような反復作業を合理化します。

セレクタとHTML解析を理解する

HTML解析とは何か?

HTML構文解析とは、HTMLドキュメントをタグ、属性、DOM(Document Object Model)などの構造要素に分解するプロセスです。パーセルはこの構造を利用して、必要なデータを正確に探し出し、抽出します。

HTML文書は

  • タグ 要素のタイプを定義する(例えば, <h1>, <p>, <img>).
  • 属性: 要素に関する追加情報を提供する(例. アイドル, クラス, href = "/stock/stock_detail.html?).
  • DOM: ウェブページを階層的に表現したもので、要素間のナビゲーションを可能にする。

セレクタとは?

XPathと CSSセレクタは、HTML文書内の要素を選択するために使用されるクエリ言語です:

  • XPath:強力で豊富な機能を持つ XPath では、DOM 内のパス、親子関係、条件に基づいてノードを選択できます。
  • CSSセレクタ: フロントエンド開発でよく使われる、よりシンプルな構文で、クラスやID、擬似セレクタに基づいて要素を選択するのに適しています。

セレクターについて詳しくはこちら

前提条件

パーセルを使い始める前に、以下のことを確認してください:

  • Pythonのインストール:からPythonをダウンロードしてインストールする。
  • 必要なライブラリ(parselrequests)をインストールします: 
pipinstallparsel requests

HTML解析のためのパーセルテクニック

IDとクラスによる要素の抽出

Parselでは、クラス名や IDを知るだけで、要素を解析することができます。これは、データ抽出のためにウェブページ内の特定の要素をターゲットにする場合に特に便利です。

デモンストレーションのために、次のように使う。 ウェブサイト例.ここでは、クラス名 プロダクトポッドこれは1つのブックエントリーを表す。

以下はそのHTML構造の例である:

この要素から抽出する:

  • 書名
  • 本の価格
  • 空席 状況

Pythonコード例

インポートリクエスト
fromparsel import セレクター

# ウェブページを取得する
url ="https://books.toscrape.com/"
レスポンス = requests.get(url)
セレクタ = セレクタ(response.text)

# 最初の商品をクラスで選択する
product = selector.css("article.product_pod").get()

# 選択された商品から詳細を解析する
product_selector = セレクタ(text=product)
title = product_selector.css("h3 a::attr(title)").get()
価格 = product_selector.css("p.price_color::text").get()
在庫状況 = product_selector.css("p.instock.availability::text").get().strip()

print("タイトル:", タイトル)
print("価格:", 価格)
print("在庫状況:", 在庫状況)

スクリプトの説明

  • ウェブページを取得する: スクリプトは ゲット リクエストを例のウェブサイトに送り、そのHTMLコンテンツを取得する。
  • 製品ブロックを選択します: CSSセレクタ article.product_pod をクリックして、そのページから最初のブックエントリーを選択する。
  • 商品の詳細を解析する: スクリプトは タイトル, 価格そして 可用性 内の特定のHTMLタグや属性をターゲットにすることで プロダクトポッド ブロックに入った。
  • 結果を表示する:抽出されたデータは、読みやすい形式でコンソールに出力される。

出力例

タイトル 屋根裏の価格:51.77ポンド
在庫あり在庫あり

要素からテキストを抽出する

ParselはHTML要素からテキストを簡単に抽出します。それがタイトルであれ、説明文であれ、あるいはウェブページ上の他の可視コンテンツであれ。

デモンストレーションのために、同じ ウェブサイト例 再びメソッドを使って1冊の本のタイトル・テキストを抽出することに焦点を当てる。 h3 タグは、クラス プロダクトポッド.

以下はそのHTML構造の例である:

この要素から抽出する:

  • 本のタイトルテキスト

Pythonコード例

インポートリクエスト
fromparsel import セレクター

# ウェブページを取得する
url ="https://books.toscrape.com/"
レスポンス = requests.get(url)
セレクタ = セレクタ(response.text)

# 最初の商品をクラスで選択する
product = selector.css("article.product_pod").get()

# 選択された商品からタイトルテキストを解析する
product_selector = セレクタ(text=product)

title_text = product_selector.css("h3 a::attr(title)").get()
print("Title Text:", title_text)

スクリプトの説明

  • ウェブページを取得する: スクリプトは ゲット リクエストを使用して、ウェブサイトからHTMLコンテンツを取得する。
  • 製品ブロックを選択します: 記事プロダクトポッド CSSセレクタは最初のブックエントリーをターゲットとする。
  • タイトルテキストを抽出する: 使用 h3 a::attr(title)スクリプトは、title 属性を <a> タグに入れ子になっている。 <h3> タグを付けている。
  • 結果を表示する: 抽出されたタイトルがコンソールに出力される。

出力例

タイトルテキスト屋根裏の光

属性の抽出 (`href`、`src`、`alt` など)

Parselでは、HTML要素からhref、src、altなどの属性値を抽出することもできます。これらの属性には、URLや画像ソース、説明テキストなどの貴重なデータが含まれていることがよくあります。

ここでは、リンク (href = "/stock/stock_detail.html?)から本の詳細ページに移動する。 <a> タグを 記事 要素に プロダクトポッド.

以下はそのHTML構造の例である:

この要素から抽出する:

  • リンク (href = "/stock/stock_detail.html?) 本の詳細ページへ

Pythonコード例

インポートリクエスト
fromparsel import セレクター

# ウェブページを取得する
url ="https://books.toscrape.com/"
レスポンス = requests.get(url)
セレクタ = セレクタ(response.text)

# 最初の商品をクラスで選択する
product = selector.css("article.product_pod").get()

# 選択された商品から'href'属性を解析する
product_selector = セレクタ(text=product)
book_link = product_selector.css("h3 a::attr(href)").get()

print("Book Link:", book_link)

スクリプトの説明

  • ウェブページを取得する:スクリプトは、ウェブサイトからHTMLコンテンツを取得するためにGETリクエストを送信する。
  • 商品ブロックを選択します:article.product_pod CSSセレクタは、最初のブックエントリーをターゲットにしています。
  • href属性を取り出す:h3 a::attr(href)を使って、スクリプトはタグの中にあるhrefの値を取り出します。
  • 結果を表示する:抽出されたURLがコンソールに出力される。

出力例

書籍リンク:カタログ/a-light-in-the-attic_1000/index.html

要素のリストの抽出

Parselを使用すると、CSSまたはXPathセレクタを使用してWebページから複数の要素を簡単に抽出できます。これは、商品のタイトル、リンク、価格などのリストを扱うときに特に便利です。

ここでは、このチュートリアルで使用するサンプルウェブサイトのホームページに表示されているすべての書籍タイトルのリストを抽出することに焦点を当てます。

以下は、関連するHTML構造の例である:

これらの要素から、我々は抽出する:

  • ホームページに表示されるすべての書籍のタイトル

Pythonコード例

インポートリクエスト
fromparsel import セレクター

# ウェブページを取得する
url ="https://books.toscrape.com/"
レスポンス = requests.get(url)
セレクタ = セレクタ(response.text)

# 全ての本のタイトルを選択
book_titles = selector.css("article.product_pod h3 a::attr(title)").getall()

# それぞれのタイトルを表示する
fortitleinbook_titles:
   print("Title:", title)

スクリプトの説明

  • ウェブページを取得する: スクリプトは ゲット リクエストを使用して、ウェブサイトからHTMLコンテンツを取得する。
  • すべてのタイトルを選択 を使用している。 CSS セレクタ article.product_pod h3 a::attr(title)をすべて選択する。 <a> タグ内 <h3> タグ プロダクトポッド 要素がある。
  • タイトルを抜粋する: について .getall() メソッドは、一致するすべてのタイトルのリストを取得します。
  • 結果を表示します:リスト内の各タイトルが1つずつ印刷されます。

出力例

タイトル 屋根裏のタイトルベルベットの傾き
タイトル想い
タイトルシャープ・オブジェクト

入れ子要素の移動

Parselは、CSSセレクタとXPathを使用して、複雑なネストされたHTML構造の効率的なナビゲーションを可能にします。これは、HTMLタグの複数のレイヤーの奥深くに埋もれているデータを抽出する場合に特に有用です。

の中から本の価格を抽出する。 プロダクトポッド 要素である。

以下は、関連するHTML構造の例である:

この入れ子構造から、我々は抽出する:

  • 最初の本の価格

Pythonコード例

インポートリクエスト
fromparsel import セレクター

# ウェブページを取得する
url ="https://books.toscrape.com/"
レスポンス = requests.get(url)
セレクタ = セレクタ(response.text)

# 最初の商品をクラスで選択する
product = selector.css("article.product_pod").get()

# ネストされた価格要素を解析する
product_selector = セレクタ(text=product)
価格 = product_selector.css("div.product_price p.price_color::text").get()

print("価格:", 価格)

スクリプトの説明

  • ウェブページを取得する:スクリプトはリクエストを使ってウェブページのHTMLコンテンツを取得する。
  • 最初の製品ブロックを選択する: これは、クラス プロダクトポッド.
  • ネストされた価格要素に移動する: を使用している。 CSS セレクタ div.product_price p.price_colorを選択すると、divの中に移動して p タグが含まれている。
  • 価格テキストを抽出する: について .get() メソッドは価格値を取得します。
  • 結果を表示します: 抽出された価格が表示されます。

出力例

価格51.77ポンド

テーブルとリストの解析

Parselは、HTMLのリストやテーブルのようなフォーマットから構造化データを抽出するプロセスを簡素化します。ウェブサイトは、商品グリッドや順序付きリストのような繰り返しパターンで情報を表示することが多く、Parselはこのようなデータを効率的に取り込むために不可欠なツールです。

例として、同じ ウェブサイト例.私たちの目標は、本のタイトルとその価格のリストを抽出することです。具体的には <ol> タグは、複数の <li> 要素があり、それぞれが個々の本を表す。

以下は、関連するHTML構造の例である:

この構造から、私たちは抽出する:

  • 各書籍のタイトル
  • 各書籍の価格

Pythonコード例

import requests
from parsel import Selector

# Fetch the webpage
url = "https://books.toscrape.com/"
response = requests.get(url)
selector = Selector(response.text)

# Select all book items in the list
books = selector.css("ol.row li.article")

# Loop through each book and extract title and price
for book in books:
    title = book.css("h3 a::attr(title)").get()
    price = book.css("p.price_color::text").get()
    print(f"Title: {title} | Price: {price}")

スクリプトの説明

  • ウェブページを取得する: スクリプトは、ウェブサイトからHTMLコンテンツを取得するためにGETリクエストを送信する。
  • すべてのブックアイテムを選択 セレクター ol.row 記事 すべて <li> 要素を順序付きリスト (<ol>)は、個々の書籍項目を表す。
  • タイトルと価格を抜粋する: h3 a::attr(title) のtitle属性を抽出する。 <a> タグを付ける。--- p.price_color::text から価格テキストを取り出す。 <p> タグを付けている。
  • 結果を表示する:スクリプトは各書籍のタイトルと価格を表示する。

出力例

タイトル A   屋根裏 屋根裏の光 | 価格 £51.77
タイトル ティッピング  ベルベット | 価格 £53.74
タイトル ミッション | 価格 £50.10
タイトル シャープ オブジェクト | 価格 £47.82
...

結論

このチュートリアルでは、Parselを使ったPythonでのWeb解析の基礎を探りました。基本的なセレクタの理解から、ネストした要素のナビゲート、属性の抽出、リストの解析まで、ParselがWebページから意味のあるデータを抽出するプロセスをどのように簡素化するかを示しました。

ここで、私たちが取材した内容を簡単に振り返ってみよう:

  • IDとクラスによる要素の抽出: CSS セレクタを使用して特定の HTML 要素をターゲットにします。
  • テキストと属性の抽出 テキストコンテンツやhrefやsrcなどの属性を要素から取り出す方法を学びました。
  • ネストされた要素の処理 HTML構造における親子関係のナビゲート方法を解説。
  • リストの解析: 表や商品リストなどの繰り返しパターンから構造化データを抽出。

次のステップ

  • Parselを使って、さまざまなウェブページや複雑なHTML構造を試してみましょう。
  • 大規模なウェブスクレイピングプロジェクトのために、Scrapyのような他のライブラリとの統合を検討する。
  • robots.txt ファイルを尊重し、サーバーに負荷をかけないようにするなど、倫理的なスクレイピングのベストプラクティスに従いましょう。

Parselはウェブスクレイピングツールキットの強力なツールであり、これを使いこなすことでデータ収集と分析の機会が無数に広がる。

ハッピー・パース!