Beautiful Soup でスクレイピング

Pythonのライブラリ(Beautiful Soup)を利用してスクレイピングしてみた

インストールとタグ操作

root@hostname:/home/shimizu/python# aptitude install python-bs4
以下の新規パッケージがインストールされます:
  python-bs4 python-chardet{a} python-lxml{a}
...

root@hostname:/home/shimizu/python# cat scraping-bs4.py
# coding: UTF-8
import urllib2
from bs4 import BeautifulSoup
res = urllib2.urlopen("http://ll.jus.or.jp/2014/program.html")
# オブジェクト<class 'bs4.element.ResultSet'>を取得し、listのように扱える
soup = BeautifulSoup(res.read())


# 先頭のタグを表示する
print soup.find('a')
# タグ内の属性を表示する
print soup.a.get('href')
# タグの中の文字を取得する
print soup.a.string

root@hostname:/home/shimizu/python# python scraping-bs4.py
<a href="index.html" rel="home">LL Diver</a>
index.html
LL Diver

すべてのaタグの要素を表示する

root@hostname:/home/shimizu/python# cat scraping-bs4-2.py
# coding: UTF-8
import urllib2,sys
reload(sys)
sys.setdefaultencoding('utf-8')

from bs4 import BeautifulSoup
res = urllib2.urlopen("http://ll.jus.or.jp/2014/program.html")
# オブジェクト<class 'bs4.element.ResultSet'>を取得し、listのように扱える
soup = BeautifulSoup(res.read())

# リンク抽出
for link in soup.find_all('a'):
    if link.string is not None:
        print link.string + ": " + link.get('href')

root@hostname:/home/shimizu/python# python scraping-bs4-2.py
LL Diver: index.html
検索: index.html%3Fp=49.html#search-container
コンテンツへ移動: index.html%3Fp=49.html#content
LL Diver: index.html
LL Diver開催案内: index.html%3Fp=9.html
プログラム: index.html%3Fp=49.html
タイムテーブル: index.html%3Fp=198.html
アンケート: index.html%3Fp=260.html
アーカイブ: index.html%3Fp=77.html
昼の部: index.html%3Fp=49.html#day
...

その他操作

root@hostname:/home/shimizu/python# python
Python 2.7.9 (default, Mar  1 2015, 12:57:24)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib2,sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> from bs4 import BeautifulSoup
>>> res = urllib2.urlopen("http://ll.jus.or.jp/2014/program.html")
>>> soup = BeautifulSoup(res.read())
>>> print soup.title
<title>プログラム | LL Diver</title>
>>> print soup.title.name
title
>>> print soup.title.string
プログラム | LL Diver
>>> soup.p
<p>LL Diverのプログラムは、<a href="index.html%3Fp=49.html#day">昼の部</a>・<a href="index.html%3Fp=49.html#night">夜の部</a>に分けて行います。<br/>
<a href="index.html%3Fp=198.html" target="_blank" title="タイムテーブル">タイムテーブル</a>もあわせてご覧ください。</p>
>>> print soup.find(id="genericons-css")
<link href="wp-content/themes/twentyfourteen/genericons/genericons.css%3Fver=3.0.2.css" id="genericons-css" media="all" rel="stylesheet" type="text/css"/>
### タグを除去して全テキストを抽出 ###
>>> print(soup.get_text())
...
### soupについて ###
>>> print type(soup)
<class 'bs4.BeautifulSoup'>
>>> print soup.prettify
...

### Tag obj ###
>>> type(soup)
<class 'bs4.BeautifulSoup'>
>>> type(tag)
<class 'bs4.element.Tag'>
>>> tag.name
'a'
### 辞書にアクセスする ###
>>> tag.attrs
{'href': 'index.html', 'rel': ['home']}

### classは予約後のため class_ というキーワード引数でCSSのクラスを検索 ###
>>> soup.find_all(class_="page_item page-item-9")
[<li class="page_item page-item-9"><a href="index.html%3Fp=9.html">LL Diver開催案内</a></li>]

実際にデータを取得する-天気予報データ-

Python で簡単なテキスト処理 (3) – Beautiful Soup を使ってスクレイピング
http://jutememo.blogspot.jp/2008/06/python-3-beautiful-soup.html
より拝借

root@hostname:/home/shimizu/python# cat scraping-bs4-3.py
# coding: UTF-8
import urllib2,sys
reload(sys)
sys.setdefaultencoding('utf-8')

from bs4 import BeautifulSoup
URL = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&prec_ch=%93%8C%8B%9E%93s&block_no=47662&block_ch=%93%8C%8B%9E&year=2008&month=01&day=12&view=p1"

# 出力する日付
DATE_FROM = 1
DATE_TO = 5

# データ取得
res = urllib2.urlopen(URL)
soup = BeautifulSoup(res.read())

#print soup.prettify
#print type(soup)

records = []
# class 属性が mtx である tr タグを対象に
for tr in soup('tr',{'class':'mtx'}):
    rec = []
    # id 属性がp_print のdivタグを対象に
    for div in tr('div',{'class':'a_print'}):
        # a タグを対象に
        for a in div('a'):
            # 日付を取得
            rec.append(a.renderContents())
    # class 属性が data_0_0 である td タグを対象に
    for td in tr('td',{'class':'data_0_0'}):
        # 各データを取得
        data = td.renderContents().strip()
        rec.append(data)
    if rec != []: records.append(rec)

# 取得したデータを出力
for rec in records:
    # 指定された日付の期間以外は出力しない
    if int(rec[0]) not in range(DATE_FROM, DATE_TO + 1): continue
    for i,data in enumerate(rec):
        if i in [1,6]: print unicode(data, 'utf-8'), "\t",
    print

root@hostname:/home/shimizu/python# python scraping-bs4-3.py
998.7   6.0
1007.2  6.2
1011.6  5.9
1014.6  7.0
1014.0  6.0
root@hostname:/home

実際にデータを取得する-宅配便の配送状況-

Pythonでスクレイピング
http://i2bskn.hateblo.jp/entry/20120820/1345478918
より拝借

root@hostname:/home/shimizu/python# cat scraping-bs4-4.py
# coding: UTF-8
import urllib,urllib2,sys,re
reload(sys)
sys.setdefaultencoding('utf-8')

from bs4 import BeautifulSoup

def kuroneko_check(n):
    r = re.compile(r'>([^<]+)<br')
    url = "http://toi.kuronekoyamato.co.jp/cgi-bin/tneko"
    data = urllib.urlencode({"number00": "1", "number01": n})
    #html = urllib2.urlopen(url,data).read().decode('shift_jis').encode('utf-8')
    html = urllib2.urlopen(url,data).read()
    soup = BeautifulSoup(html)
    #print soup.prettify
    s = str(soup.find_all("td",class_="ct")[0].font)
    return r.findall(s)[0]

print(kuroneko_check('4320-xxxx-xxxx'))

root@hostname:/home/shimizu/python# python scraping-bs4-4.py
配達完了

実際にデータを取得する-文章を抽出する-

第3回 スクレイピングにチャレンジ! (2/3)
http://itpro.nikkeibp.co.jp/article/COLUMN/20080407/298191/?ST=develop&P=2
より拝借

root@hostname:/home/shimizu/python# cat scraping-bs4-5.py
# coding: UTF-8
import urllib2,sys
reload(sys)
sys.setdefaultencoding('utf-8')

from bs4 import BeautifulSoup,NavigableString

url = 'http://www.linux.or.jp/'

html = urllib2.urlopen(url).read()

soup = BeautifulSoup(html)

def printText(tags):
    for tag in tags:
        if tag.__class__ == NavigableString:
            print tag,
        else:
            printText(tag)
    print ""

printText(soup.findAll("p"))

root@hostname:/home/shimizu/python# python scraping-bs4-5.py
すぐに使えるリナックスチュートリアルをご紹介
最新のlinuxニュースやインタビュー記事をお届けします。

30週連続企画:今週はShuah Khan氏の仕事場に潜入!
  続きを読む...
...

実際にデータを取得する-ニュースサイト-

BeautifulSoup実践 -pythonで超カンタンにスクレイピング
http://d.hatena.ne.jp/lolloo-htn/20090128/1233155734
より拝借

root@hostname:/home/shimizu/python# cat scraping-bs4-6.py
# coding: UTF-8
import urllib2,sys
reload(sys)
sys.setdefaultencoding('utf-8')

from bs4 import BeautifulSoup,NavigableString
url = "http://www.yomiuri.co.jp/sports/"

# データ取得
res = urllib2.urlopen(url)
soup = BeautifulSoup(res.read())

def printText(tags):
    for tag in tags:
        if tag.__class__ == NavigableString:
            print tag
        else:
            printText(tag)

for data in soup('span',{'class':'headline'}):
    printText(data)

root@hostname:/home/shimizu/python# python scraping-bs4-6.py
国際陸連が不正の証拠隠蔽か…ドーピング疑惑
(2015年08月16日 21時52分)
興南、2点差から粘り…鳥羽に逆転勝ちで8強
(2015年08月16日 18時34分)
2か月ぶり先発のG・大竹、1失点も白星ならず
(2015年08月16日 18時27分)
...

参考URL

PythonとBeautiful Soupでスクレイピング
http://qiita.com/itkr/items/513318a9b5b92bd56185
Beautiful Soup
http://kondou.com/BS4/
Python で簡単なテキスト処理 (3) – Beautiful Soup を使ってスクレイピング
http://jutememo.blogspot.jp/2008/06/python-3-beautiful-soup.html
Pythonでスクレイピング
http://i2bskn.hateblo.jp/entry/20120820/1345478918
スクレイピングまとめ
http://matome.naver.jp/odai/2136441394137974201