py-py’s blog

何か書くよ

スクレイピング

目的

  • 標準ライブラリ「urllib.request」を使ってサイトにアクセスし、htmlを取得する
  • 取得したhtmlを「BeautifulSoup」を用いて解析、要素を取得する

前提

  • BeautifulSoupをインストールしていること

書くこと

  • urlopen()
  • decode()
  • BeautifulSoup()
  • Beautifulsoup.find()
  • Beautifulsoup.find_all()

urllib.requestを使って、外部サイトへアクセスする

URL = "XXXXX" 
html = urllib.request.urlopen(URL)

取得したhtmlを読み込むが、その際バイナリのため、decode()で文字列に変換したhtmlを得る

result = html.read().decode("utf-8")
# print(result)すると文字列なhtmlがでてくる
# print(type(result))

BeautifulSoupを使って、取得したhtmlを指定したパーサーによって解析する

soup = BeautifulSoup(html, "html.parser")

任意の要素を取得する
soupに対し、ルート要素のから「.」を利用して要素にアクセスし、値を取得できる
※閉じタグは省略

# ここでは<html><body><h1>にアクセス
h1 = soup.html.body.h1
# ここでは<html><body>の最初に出てくる<p>にアクセス
p1 = soup.html.body.p
# ここでは<html><body>の二番目に出てくる<p>にアクセス 
p2 = p1.next_sibling.next_sibling

取得した要素のテキスト部分を表示したい場合

print(h1.string)
print(p1.string)
print(p2.string)

find()を用いて任意のidで要素を取得する

xxx = soup.find(id="xxx")

同様に要素のテキスト部分を表示するには以下

xxx.string

find_all()で複数の要素を取得する

xxx = soup.find_all("xxx")

取得した要素はfor文でループさせる
取得要素になどリンクがある場合

href = xxx.attrs["href"]

とするとhref以下の要素を取得することができる