スクレイピングの方法
スクレイピングは、
HTMLのタグの基本
Webページは、HTML(ハイパーテキスト)で書かれており、HTMLはタグで文字の修飾や機能を与えWebページを表示します。そのためスクレイピングを実施する時は、HTMLのタグを最初に理解することが必要です。
タグ名 | 説明 | 備考 |
---|---|---|
<h> | 見出しの作成で、h1,h2・・ | |
<a> | リンクの作成 | |
<table> | 表の作成 | |
<div> | グループを作る | |
<ul> | リスト(箇条書き)を作る | |
<p> | 段落を作成する | |
<form> | フォームを作る | |
<button> | ボタンを作成 |
Webページから要素を取り出す
find
メソッドで要素を一つ取り出す。
#ライブラリーのimport
from pathlib import Path
from bs4 import BeautifulSoup
#ファイルのパスの設定
hfile = Path('flowerpark.html')
#ファイルの読み込み。テキストで読みこむ。
htext = hfile.read_text(encoding='utf-8')
#BeautifulSoupオブジェクトの作成
soup = BeautifulSoup(htext, 'html.parser')
#soupオブジェクトの中からh2タグの内容を変数h2に入れる。h2はタグ全体。textでその中のテキスト。
h2 = soup.find('h2')
print(h2)
print(h2.text)
#soupオブジェクトの中からh2タグの内容を変数h3に入れる。
h3 = soup.find('h3')
print(h3)
print(h3.text)
#<h2>皆様へのお願い</h2>
#皆様へのお願い
#<h3>開園時間</h3>
#開園時間
a
タグのhref
属性の取り出し
href
属性は、「hypertext reference」でハイパーテキストの参照。
a_tag = soup.find('a')
print(a_tag)
#<a href="gallery/flower1.html">
#<img alt="" height="120" src="img/flower1.jpg" width=" 200"/>
#</a>
print(a_tag['href'])
#gallery/flower1.html
id
属性、class
属性を指定して要素を取り出せる。
news = soup.find(class_='block-news')
print(news)
#<div class="block-news">
#<h2>皆様へのお願い</h2>
#<ul>
#<li>駐車場の混雑緩和のため、公共交通機関をご利用ください</li>
#</ul>
#</div>
span = soup.find('span', class_='info-access')
print(span)
#<span class="info-access">○○線「△△」駅下車 徒歩5分</span>
find_all
メソッドで要素を全部取り出す。
find
メソッドとfind_all
の違い
項目 | find |
find_all |
---|---|---|
取り出す要素 | 最初の1件 | 要素全て |
戻り値 | Tagオブジェクト | ResultSetオブジェクト |
要素がない場合の戻り値 | None | 空のResultSetオブジェクト |
タグは複数設定することで、複数取り出せる。
引数limit
をつけることで、個数を設定できる。
for h2 in soup.find_all('h2'):
print(h2, ':', h2.text)
#<h2>皆様へのお願い</h2> : 皆様へのお願い
#<h2>新着情報</h2> : 新着情報
#<h2>フラワーギャラリー</h2> : フラワーギャラリー
#<h2>公園の利用案内</h2> : 公園の利用案内
for h_tag in soup.find_all(['h1', 'h2', 'h3']):
print(h_tag)
#<h1>フラワー公園</h1>
#<h2>皆様へのお願い</h2>
#<h2>新着情報</h2>
#<h2>フラワーギャラリー</h2>
#<h2>公園の利用案内</h2>
#<h3>開園時間</h3>
#<h3>交通案内</h3>
for h_tag in soup.find_all(['h1', 'h2', 'h3'],limit=2):
print(h_tag)
#<h1>フラワー公園</h1>
#<h2>皆様へのお願い</h2>
引数class属性を設定することで、クラス中のタグを取り出せる。
for span in soup.find_all('span',
class_='info-access'):
print(span)
#<span class="info-access">○○線「△△」駅下車 徒歩5分</span>
#<span class="info-access">○○バス「△△」下車 徒歩2分</span>