Edited at

python3でwebスクレイピング(Beautiful Soup)

python3でwebスクレイピングのために、

Beautiful Soupを利用した方法を紹介します


環境

$ cat /etc/redhat-release 

CentOS Linux release 7.4.1708 (Core)

$ python3 -V
Python 3.5.4

$ pip -V
pip 9.0.1


install

下記を使ってスクレイピングします。


  • requests: HTTP ライブラリ

  • beautifulsoup4: htmlパーサー(pythonから呼び出し)

  • lxml: htmlパーサー(beautifulsoup4内部で利用)

pip install requests

pip install beautifulsoup4
pip install lxml


インストール確認

pip freeze | grep -e request -e lxml -e beautiful 

beautifulsoup4==4.6.0
lxml==4.0.0
requests==2.18.4


使い方

まずはインポートします。

import requests

from bs4 import BeautifulSoup

次に、HTMLを取得してきます。

target_url = '***'

r = requests.get(target_url) #requestsを使って、webから取得

htmlパース用のオブジェクト作成します。内部で利用するパーサーを指定する場合は、"html.parser"の部分を"lxml"などに変更します。

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

or
soup = BeautifulSoup(r.text, 'lxml') #要素を抽出

lxmlは速度が早いのでおすすめらしい。下記がわかりやすかった。


パーサの良し悪しを考えるとlxmlでチャレンジしてダメならhtml5libを試すのが良さそう。

PythonでWebスクレイピングする時の知見をまとめておく



特定のタグを取得

soup.find_all("a")

soup.find("a")
soup.find_all("a", attrs={"class": "link", "href": "/link"})

import re
soup.find_all(re.compile("^b"))
soup.find_all("a", text=re.compile("hello"))

soup.select('a[href^="http://"]')


サンプルコード

全てのaタグを取得し、リンク先URL(href属性)を表示します


import requests
from bs4 import BeautifulSoup

target_url = '***'
r = requests.get(target_url) #requestsを使って、webから取得
soup = BeautifulSoup(r.text, 'lxml') #要素を抽出

for a in soup.find_all('a'):
print(a.get('href')) #リンクを表示