リオラボ
icon

③Pythonでウェブページから特定要素を抽出する方法(見出し、画像、リンクなど)【サンプルコード付き】

このブログではPythonを使ったスクレイピングを、初心者向けにサンプルコード付きで解説しています。以下に紹介する記事では、①から⑨のステップでスクレイピングの方法を学び、実践に役立てられるよう体系的にまとめています。

【①〜⑨まとめ】PythonでWebスクレイピングを実践する方法【サンプルコード付き】

【①〜⑨まとめ】PythonでWebスクレイピングを実践する方法【サンプルコード付き】

Posted on 9月 29, 2024 | Category: Python

このブログではPythonスクレイピングを初心者向けに解説していきます。順番に各記事で解説しており入門者向けです。サンプルコード付きで解説するので実践的…


こちらの記事ではBeautifulSoupを使ったスクレイピングの基本を解説しました。

記事内では指定されたURLからHTMLデータを取得しタイトルを出力するという簡単なコードでしたが、今回はより具体的にHTMLデータの見出しや画像、リンクなど各要素を取得する方法を解説していきます。

例えばショッピングサイトであればその商品のタイトル、価格、画像、商品説明、カテゴリなどが必要になるかもしれません。ということでURLを元にHTMLを解析していき、自分が欲しいデータ、要素を実際に取得する方法をサンプルコードで説明していきます。

 

基本的な考え方

Requests、BeautifulSoupの基本から進めます。

 

試しに上記コードの変数webpage_soupをそのままプリントすると、ブラウザでそのページを検証するのと同じようにHTML構造が取得できるのです。つまりこれだけの操作でそのWebサイトのデータは基本的に全て取得できているということですね。(ただしウェブサイトがjavaScriptなどで動的に生成される場合、Seleniumが必要)

あとはこのHTMLデータの中から必要な要素を取り出してあげればいいということになります。

BeautifulSoupライブラリにはselect、findといった2つの主要なメソッドがあります。これらを使うことで例えばh1タグ要素を取得したり、クラスやIDを指定して要素を取得するといったことが可能です。ざっと説明するとselectは指定したタグやクラスに一致する全てを取得、findは見つかった最初の要素だけを返します。

 

h2タグなどを取得する方法

ウェブサイトにもよりますが、h2タグがタイトル、h3が各見出しなどになっていることがあります。その場合そのタグをそのまま指定して取得してあげればOKです。

以下サンプルコードでは分かりやすいよう、URLの代わりにHTMLコードを直接記述しています。実際にその要素が取得できるか確認していきましょう。

 

単純にh2タグを全てセレクト。テキスト含む全てのコンテンツが取得される

select メソッドを使うことで、特定の要素の取得ができます。単純にh2タグを全てセレクトすると、テキスト含む全てのHTMLコンテンツが取得されます。

h2タグのテキストだけを取得

 

select メソッドで取得された要素はリストではなく Tag オブジェクトのリストであるため、for ループを使用して各要素のテキストを取得する必要があります。

 

インデックスを使って取得する方法

 

このようにh2_tagsにインデックスを指定してひとつの要素を取得することもできます。その際は.textを直接使うことができます。

 

クラス名を指定する方法

今度はタグだけではなく、クラス名を指定して取得してみましょう。

product-titleクラスを持つh2タグを取得

h2タグの中でclassがproduct-titleの要素だけを取得します。これにより、h2タグだけが付与されている”商品一覧”といったテキストは取得されなくなりました。このようにタグやクラス名を詳細に指定することで不要な要素を除外することができます。

 

product-priceクラスを取得

 

続いてクラス名がproduct-priceの要素を取得します。このようにクラス名だけでも取得できます。

 

タグ、クラス名を指定する順番による違い

例として、以下の2つのHTML構造があったとします。

 

h1要素かつ、クラスがtitleのものを取得

 

titleクラスの中にあるh1要素を取得

 

それぞれの関数を呼び出すと、get_title()はタイトル1、get_title2()はタイトル2がプリントされます。このように、HTMLの構造をしっかりを把握しながら要素を取得していきましょう。

 

.findで最初の要素だけを取得する

 

最初の要素だけを取得する場合は.find

 

.selectと違い、最初のh1要素だけが取得されます。.textも直接指定できます。

 

複雑な構造を取得する

findメソッドを使って最初に見つかったdivタグの中からクラス名が”title”である要素を探し、その中に含まれるh1タグを取得しています。このようにHTMLの構造通りにタグ指定が必要です。

 

タグ指定の注意点

.select() メソッドはCSSセレクタを使用して要素を選択するため、階層構造に依存しない。そのため、<div class=”title”>ではdivタグを指定する必要がなく、単にクラスやID、タグ名などのセレクタを指定するだけで要素を選択できる。

.find() メソッドはhtml構造に依存するため、構造通りにタグ指定が必要。<div class=”title”>では、例:.find(“div”, class_=”title”).find(“h1″)のように、最初の引数として <div> タグを指定して、class=”title” を持つ <div> 要素を最初に見つける。その後、.find(“h1”) を使用してこの <div> 要素の中から直接的な子要素である <h1> 要素を取得。

 

リンクの取得方法

例として以下のようなリンクがあったとします。

 

この場合、entry-titleクラスの中からa要素を取得すればいいわけです。

 

全てのaタグを取得する場合

 

この場合タグ、クラス名に一致するすべてのa要素からhref属性を取得しています。

 

各要素の最初のaタグだけをfindする場合

 

Img要素(画像)を取得する場合

このようにsrc属性の取得もできます。

まとめ

この記事ではPythonのBeautifulSoupライブラリを使用して、特定のウェブページから必要なデータ要素(見出し、画像、リンクなど)を取得する方法について解説しました。上記方法を使えば単一のページであれば大体のデータはスクレイピングできるかと思います。

複数のページに渡ってスクレイピングしたい場合、もう少し複雑になります。これについては以下の記事で解説しています。

④Pythonで複数ページをまとめてスクレイピングする方法を解説【サンプルコード】

④Pythonで複数ページをまとめてスクレイピングする方法を解説【サンプルコード】

Posted on 9月 28, 2024 | Category: Python

このブログではPythonを使ったスクレイピングを、初心者向けにサンプルコード付きで解説しています。以下に紹介する記事では、①から⑨のステップでスクレイピ…