【BeautifulSoup】HTMLの要素を取り出す

 

この記事では、BeautifulSoupを使ってHTMLの要素を取り出してみたいと思います。

 

「Webページの特定の情報だけ取り出したい」

「Pythonでスクレイピングをするための基礎を勉強したい」

 

そういった方に読んでいただければと思います。

 

[toc]

 

使用する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

 

参考

以上です。お疲れ様でした。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog