「BeautifulSoup」とは、Pythonでスクレイピングするのに便利なライブラリです。
「BeautifulSoup」を使うことで簡単にWEBサイト内のデータ解析を行う事ができます。
よく使うスクレイピング使い方についてまとめてみました。
本記事の内容
1. BeautifulSoupのインストール方法
pip経由でインストールします。
> pip install beautifulsoap4
2. 基本的な使い方
2.1. 任意のidで要素を探す – find()
# titleというidの部分を抽出
title = soup.find(id="title")
# テキスト部分を表示する
print(title.string)
2.2. 複数の要素を取得する – find_all()
# aタグを全て抽出
links = soup.find_all("a")
for a in links:
href = a.attrs['href']
text = a.string
print(text, ">", href)
2.3. CSSセレクタを使う select_one() / select
1つの要素だけ取得するにはselect_oneを使います。通常はselectを使う事が多いです。
h1 = soup.select_one("div#meigen > h1").string
li_list = soup.select("div#meigen > ul.items > li")
for li in li_list:
print("li = ", li.string)
3. CSSセレクタについて
3.1. CSSセレクターの関係
ハマりそうなところだけ抜粋しています。
書式 | 説明 |
---|---|
セレクタ,セレクタ | 列挙された複数のセレクタ(例)h1,h2 |
セレクタ セレクタ | 下の階層の子孫要素(例)div h1 |
セレクタ>セレクタ | 直下の階層の要素(例)div h1 |
セレクタ+セレクタ | 同じ階層で直後に隣接している要素(例)h1+h2 |
セレクタ1~セレクタ2 | セレクタ1からセレクタ2までの要素(例)p~ul |
要素[att] | 特定の属性名を持つ要素 |
要素[att=”val”] | att属性にvalという値を持つ要素 |
要素[att~=”val”] | att属性の値候補valに一致した要素 |
要素[att | =”val”] | att属性の値がvalで始まる要素(ただしハイフン区切り) |
要素[att^=”val”] | att属性の値がvalで始まる要素 |
要素[att$=”val”] | att属性の値がvalで終わる要素 |
要素[att*=”val”] | att属性の値にvalを含む要素 |
3.2. 正規表現での抽出
正規表現で必要なものだけを抽出する方法です。
reライブラリを使います。
import re
# httpsのものだけを抽出
li = soup.find_all(href=re.compile(r"https://"))
for e in li
print(e.attrs['href'])
4. リンク先をダウンロードする
4.1. 相対パスの展開方法
urllib.parse.urlhoin()を利用して相対パスを絶対パスに変換する方法です。
from urllib.parse import urljoin
base = "http://exsample.com/html/a.html"
print(urljoin(base, "b.html")) # http://exsample.com/html/b.html
print(urljoin(base, "sub/c.html")) # http://exsample.com/html/sub/c.html
print(urljoin(base, "../index.html")) # http://exsample.com/index.html
print(urljoin(base, "../img/hoge.png")) # http://exsample.com/img/hoge.png
ダウンロード方法
os.path.existsとmkdirsを使ってディレクトリを作成する方法は結構使います。
ファイルのダウンロードにはurlretrieveを使ってます。
def download_file(url):
o = urlparse(url)
savepath = "./" + o.netloc + o.path
if re.search(r"/$", savepath): # ディレクトリならindex.html
savepath += "index.html"
savedir = os.path.dirname(savepath)
# すでにダウンロード済み?
if os.path.exists(savepath):
return savepath
# なければダウンロードのディレクトリを作成
if not os.path.exists(savedir):
print("mkdir=", savedir)
makedirs(savedir)
# ファイルをダウンロード
try:
print("download=", url)
urlretrieve(url, savepath)
time.sleep(1)
return savepath
exept:
print("ダウンロード失敗:". url)
retu
Pythonのオススメ勉強方法
私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全」です。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。
内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
今回は以上となります。
コメント