Pythonでスクレイピングする際にBeautifulSoupを使う方法があります。
使い方を説明するウェブサイトは多いのですが分かりにくいものが多いです。
おそらく「select」を使う方法を使っていないからだと思います。
CSSのセレクタに慣れている場合、「select」を使う方法が便利です。
ここではBeautifulSoup4を使います。
インストールは次のようにします。詳細は省略します。
$ pip install beautifulsoup4
基本
import requests
from bs4 import BeautifulSoup
url = "https://stabucky.com/wp/archives/10789"
response = requests.get(url)
response.encoding = response.apparent_encoding
bs = BeautifulSoup(response.text, "html.parser")
from bs4 import BeautifulSoup
url = "https://stabucky.com/wp/archives/10789"
response = requests.get(url)
response.encoding = response.apparent_encoding
bs = BeautifulSoup(response.text, "html.parser")
requestsとBeautifulSoupをインポートします。
次に取得したいページのURLを指定します。ここではこのブログの「歴代音楽CD総売上枚数トップ10」というページを指定しています。
titleタグ(文字列の取得)
title = bs.select("title")[0].get_text()
print(title)
print(title)
titleタグを取得して文字列を印字します。
titleタグは1個しかありませんが複数設定されている場合もありうるので「0」として最初のtitleタグを取得します。
get_text()でタグ内の文字列を取得します。
印字例
歴代音楽CD総売上枚数トップ10 | You Look Too Cool
aタグ(リンクの取得)
anchors = bs.select("a")
for anchor in anchors:
print(anchor.get("href"))
for anchor in anchors:
print(anchor.get("href"))
aタグを取得してリンク先URLを印字します。
全てのaタグをを取得します。
それぞれのaタグについてget(“href”)でURL取得します。
印字例
https://stabucky.com/wp
https://twitter.com/share
//b.hatena.ne.jp/entry/https://stabucky.com/wp/archives/10789
https://getpocket.com/save
https://stabucky.com/wp/archives/6382
(省略)
https://twitter.com/share
//b.hatena.ne.jp/entry/https://stabucky.com/wp/archives/10789
https://getpocket.com/save
https://stabucky.com/wp/archives/6382
(省略)
tableタグ(表内のデータの取得)
table = bs.select("table")[0]
trs = table.select("tr")
arrs = []
for tr in trs:
tds = tr.select("th,td")
arr = []
for td in tds:
arr.append(td.get_text())
arrs.append(arr)
print(arrs)
trs = table.select("tr")
arrs = []
for tr in trs:
tds = tr.select("th,td")
arr = []
for td in tds:
arr.append(td.get_text())
arrs.append(arr)
print(arrs)
tableタグを取得して内容をリスト(配列)に格納します。
tableタグは「0」として最初のtableタグを取得します。
次にtrタグを全て取得します。
これをループしてthタグ、tdタグを全て取得します。
これらをリストに格納します。
印字例
[
['順位', 'アーティスト', '枚数(万枚)'],
['1', 'B’z', '8,262'],
['2', 'Mr.Children', '5,955'],
['3', 'AKB48', '5,304'],
(省略)
]
['順位', 'アーティスト', '枚数(万枚)'],
['1', 'B’z', '8,262'],
['2', 'Mr.Children', '5,955'],
['3', 'AKB48', '5,304'],
(省略)
]
その他
該当がある場合だけ処理
selectで検索したときに該当がある場合だけ処理するにはifで判定することができます。
score = temp.select(".score")
if score:
# 処理
if score:
# 処理
リンク先のURLを取得
<a href="url">
のURLを取得するには次のようにします。
href = temp.attrs["href"]
タグ内のタグ付きの文字列
前述の通り、get_text()でタグ内の文字列を取得できます。
では、タグ内のタグ付きの文字列はどうやって取得するか。
strを使うと取得できます。
tags = bs.select(".sample")
text = str(tags[0])
text = str(tags[0])
コメント