Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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'))         #リンクを表示
mtskhs
Backend Developer. Gopher, python/Django, Ruby on Rails
https://matsu0228.github.io/aboutme/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away