BeautifulSoup入門 スクレイピング実践編 タイトルとリンク取得まで【python】
02 28, 2019
スクレイピングをしたい
Webサイトから情報をまとめてCSVでごにょごにょしたいなどにスクレイピングは便利です。
今回は、Pythonのスクレイピングによく使われるBeautifulSoupを使って勉強していきます。
BeautifulSoupには便利な機能がたくさんあります。
今回もcrieitさんからデータを抜いていきます。(制作者のdalaさんには了解済み)
今回の目標
今回の目標はタイトルと記事URLの取得とします。
ライブラリの導入
BeautifulSoup単体ではURLをからデータを持ってこれません。 requestsを併用します。
from bs4 import BeautifulSoup
import requests
Requestsを使って、webからデータを取得
requestsを使用してデータを持ってきます。
url = "https://crieit.net/"
r = requests.get(url)
BeautifulSoupで要素を整形する
つぎにBeautifulSoupで要素を整形する
soup = BeautifulSoup(r.text)
crieitの記事タイトルの中身を確認
抜きたいデータはタイトルとURLですのでその箇所の要素を確認します。
<h5 class="card-title">
<a href="https://crieit.net/posts/Tilemap-5c73afa5127c1">Tilemapからミニマップを作成してみた①</a>
</h5>
取り方としては
- h5タグで絞り込む
- classで絞り込む
とかでなんとかなりそうです。
soup.find_all
試しにsoup.find_allで値を取得してみましょう。
titles =soup.find_all("h5")
print(titles)
[<h5 class="card-title">クロス投稿可能</h5>, <h5 class="card-title">自由に投稿</h5>, ]
のように配列で渡されてきました。これでは視認性が悪いです。forで表示してみましょう。
for title in titles:
print(title)
すると
<h5 class="card-title">Nuxt.js+ExpressのプロジェクトをTypeScript化する</h5>
<h5 class="card-title">Firestoreの参照型によるリレーションを試す</h5>
<h5 class="card-title"><a href="https://crieit.net/posts/Tilemap-5c73afa5127c1">Tilemapからミニマップを作成してみた①</a></h5>
<h5 class="card-title"><a href="https://crieit.net/posts/BeautifulSoup-soup">BeautifulSoup入門 soup.の挙動を確認する</a></h5>
のように出力されます。aタグで拾ってきた方が良さそうです。
soup.selectを使う
そこでsoup.selectを使うとCSSセレクタで抽出ができます。
titles =soup.select("h5 a")
print(titles)
for title in titles:
print(title.text)
link = title.get("href")
print(link)
これで無事
Tilemapからミニマップを作成してみた①
https://crieit.net/posts/Tilemap-5c73afa5127c1
BeautifulSoup入門 soup.の挙動を確認する
https://crieit.net/posts/BeautifulSoup-soup
BeautifulSoup入門 HTMLを取得して表示する【Python】
https://crieit.net/posts/BeautifulSoup-HTML-Python
のようにキチンと取得できました。