この記事では、BeautifulSoupを使ってHTMLの要素を取り出してみたいと思います。
「Webページの特定の情報だけ取り出したい」
「Pythonでスクレイピングをするための基礎を勉強したい」
そういった方に読んでいただければと思います。
目次
使用するHTML
書籍「Automate the Boring Stuff with Python」で紹介されていたサンプルのHTMLを使ってみます。
<html> <head> <title>The Website Title</title> </head> <body> <p>Download my <strong>Python</strong> book from <a href="http://inventwithpython.com">my website</a>.</p> <p class="slogan">Learn Python the easy way!</p> <p>By <span id="author">Al Sweigart</span></p> </body> </html>
3行の<p>要素が入ったとてもシンプルなものです。登場する要素は以下の通り。
- <p>要素:テキストの段落を示す
- <strong>要素:文字を太字にする
- <a>要素:URLのリンク
- <span>要素:単体で意味を持たない、id属性やCSSクラス属性を指定する
また、要素の他に属性というものが登場します。以下の2種類の属性があります。
- id属性:id=”hoge”のように、id=で始まるもの
- CSSクラス属性:class=”fuga”のように、class=で始まるもの、スタイルシートの指定などで使われる
このサンプルHTMLファイルはexmaple.htmlという名前で保存して使います。
全ての<p>要素を取り出す
まず初めにHTMLの中にある全てのP要素を取り出してみます。
import bs4 ex_file = open('data/example.html') ex_soup = bs4.BeautifulSoup(ex_file) #CSSセレクタで全てのp要素を取り出す elems1 = ex_soup.select('p') print(len(elems1)) for elem in elems1: print(elem.getText())
htmlファイルを読み込んで、BSのオブジェクトに変換します。
そのあとにCSSセレクタを使って、<p>要素を全て選択しています。CSSセレクタの返り値はリストですが、リスト長を確認するためにlen()関数を使って表示するようにしています。
リストの要素をfor文で取り出し、内部テキストを表示するためにgetText()関数を使っています。
実行結果は以下の通り。
3 Download my Python book from my website. Learn Python the easy way! By Al Sweigart
<p>タグを含む要素が3つ見つかり、それぞれの内部テキストが表示されました。
要素の中の要素を選択する
最初の<p>要素の中には、<strong>要素があります。このように要素の中にある要素だけを取り出すには、「’p > strong’」のように指定します。
elems2 = ex_soup.select('p > strong') print(elems2[0].getText())
出力は以下の通り。
Python
URLを取り出す
サンプルのデータには、<a>要素にURLが含まれています。このURLだけを取り出してみます。
elems3 = ex_soup.select('p > a') print(elems3) print(elems3[0].attrs) print(elems3[0].attrs['href'])
attrs属性は、タグの全ての属性を辞書として保存しています。キーを指定すると以下のようにURLが取り出せます。
[<a href="http://inventwithpython.com">my website</a>] {'href': 'http://inventwithpython.com'} http://inventwithpython.com
CSSクラス属性を取り出す
サンプルの中には、sloganというクラスを使っている部分があります。このクラスが指定された要素を取り出してみましょう。
#CSSセレクタで「CSSクラス属性」が「slogan」である要素を取り出す elems5 = ex_soup.select('.slogan') print(elems5[0])
実行結果は以下の通り。
<p class="slogan">Learn Python the easy way!</p>
id属性を取り出す
HTMLの著者の情報が「id = ‘author’」という形で指定されています。この著者名を取り出してみましょう。
elems4 = ex_soup.select('#author') print(elems4[0].getText())
Al Sweigart
参考
以上です。お疲れ様でした。