python+bs4でスクレイピング

python3.7+BeautifulSoup4を使ったスクレイピングの基本をお勉強します。

参考サイト:http://kondou.com/BS4/

導入

$ pip install beautifulsoup4 # BeautifulSoup4のインストール
$ pip install lxml # htmlパーサーのインストール

htmlオブジェクトの用意

htmlDocument = "<html><body><p>hoge</p></body></html>"
htmlDocument = """ #複数行なら
<html>
<body>
<p>
hoge
</p>
</body>
</html>
"""

ウェブサイトをhtmlとして取得する

$ pip install requests  # httpリクエストをやり取りできるやつ
import requests

get = requests("ほしいサイトのURL")
htmlDocument = get.text # html全文を取得
status = get.status_code  # ステータスコードを取得(200なら成功)

成否判定にステータスコードよく使うのでメモ。

404用のhtmlが用意してあったり、自動遷移が入ってるサイトだと404の時にうまくエラーコードが取れないっぽい?(404だよーってページのhtmlがちゃんと取れて200が返ってくる場合がある)

スープを作る

from bs4 import BeautifulSoup
import lxml

soup = BeautifulSoup(htmlDocument,"lxml"# これで解析できる
soup = BeautifulSoup(open("index.html"),"lxml"# ファイルを渡してもいい

ぐつぐつ。

要素にアクセスする

p = soup.p # soup内の最初のp要素を取得する・戻り値はlist
hoge = soup.a["class"] # soup内の最初のa要素に指定されているクラス名を取得する

ダメな例:

p = soup.p
NG = p.span
# soup.pの戻り値がtagオブジェクトじゃなくてlistなので、2行目でエラーになる

全ての要素を取得する

pList = soup.select("p") # すべてのp要素
divList1 = soup.select(".hoge") # すべてのhogeクラスを持つ要素
divList2 = soup.select(".hoge.fuga") # すべての、hoge、fuga両方のクラスを持つ要素
divList3 = soup.select("#nya"# IDがnyaの要素/IDで取得したいときはシャープを使う

要素内の本文を取得する

string = soup.select("p").string  # <p>hoge</p>のhogeが取れる

ある要素配下のある要素

divList = soup.select("#nya .hoge"# IDがnyaの要素の配下のhogeクラスを持つ要素
# 半角スペースでつなげる

n番目要素

divList = soup.select("#nya .hoge:nth-of-type(1) p)  # 1番目のhogeクラスを持つ要素の配下のp
# (nth-of-typeの記法はCSSと同じで1始まり)

ユーザーエージェントを指定する

参考:Pythonでスマホ用のページのwebスクレイピングを試してみる

ヘッダーにユーザーエージェント情報を入れる。かんたん。


この記事が気に入ったらサポートをしてみませんか?