Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

BeautifulSoup4の使い方

htmlの構文解釈のライブラリです。
 
○htmlの準備

# -*- coding: utf-8 -*-

import urllib.request
from bs4 import BeautifulSoup

url = "http://python-remrin.hatenadiary.jp/"
f = urllib.request.urlopen(url)
html = f.read().decode('utf-8')

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

 
○タイトルの表示

title タグ+文字
title.name タグのみ
title.string 文字のみ

 

print(soup.title)        #<title>Remrinのpython攻略日記</title>
print(soup.title.name)   #title
print(soup.title.string) #Remrinのpython攻略日記

 
○ヘッダー、本文の取得

h = soup.head    #ヘッダーの取得

b = soup.body.b  #bodyの中の最初のbタグを取得

○Aタグの取得

soup.find_all("a") すべてのaタグのリスト
soup.find("a") 1つめのみ
soup.a 1つめのみ

 

a_list = soup.find_all("a")
#print(a_list)     #実際にprintすると100件くらい表示される

a_list = soup.find_all("a", limit=5)  #最大数を5に指定
print(a_list)

a = soup.find("a") #1つめだけ
print(a)           #<a href="#" id="sp-suggest-link">スマートフォン用の表示で見る</a>

a = soup.a         #1つめだけ
print(a)           #<a href="#" id="sp-suggest-link">スマートフォン用の表示で見る</a>

a = soup.find("A")
print(a)           #None 存在しないとき。

 
○タグの属性の取得

print(soup.a.get("href")) ##
print(soup.a.get("id"))   #sp-suggest-link

 
○文字列の取得

print(soup.a.string)            #スマートフォン用の表示で見る

strings = soup.strings          #ジェネレータ

strings = soup.stripped_strings #空白文字を除去したジェネレータ

 
○入れ子のタグも取得できる。
最初のdivの中のaタグすべて

#最初のdivの中のaタグすべて
da1 = soup.div.find_all("a")
print(da1)   #[<a href="#" id="sp-suggest-link">スマートフォン用の~

#最初のdivの中の最初のdivの中の最初のaタグ
print(soup.div.div.a)

 
○条件を絞ったタグの取得

soup.find_all("a", class_="link", href="/link") #「class」はpythonの予約語

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

soup.find_all(class_="link", href="/link")

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

 
正規表現の利用

import re

#bで始まるすべてのタグを取得
a = soup.find_all(re.compile("^b"))
#print(a)   #大量

#href属性として「link」という文字列を含むものすべて
a = soup.find_all(href=re.compile("link"))

#文字列にhelloを含むaタグすべて
soup.find_all("a", text=re.compile("hello"))

 
参考:
PythonとBeautiful Soupでスクレイピング
BeautifulSoup4 ドキュメント(英語)