Pythonのライブラリ「BeautifulSoup」に関して解説します。
BeautifulSoupという一風変わった名前ですが、ルイス・キャロルの「不思議の国のアリス」の中の詩の名前に由来しています。
このライブラリは Web スクレイピングに役立ちます。
具体的には、HTML や XML から特定のデータを抽出することができます。
例えば、特定のサイトから <a> タグ内にある URL を全て抽出することができます。
動作環境
以下の環境で動かしてみます。
- OS:CentOS7
- Python:3.6.2
BeautifulSoupのインストール
インストールは簡単です。
pip コマンドを sudo で実行します。
※sudoで実行する理由は、Pythonのライブラリパスが「/usr/lib64/python3.6」にあり、root 権限でなければ書き込み出来ないからです。
[test@test07 ~]$ sudo pip3 install beautifulsoup4 |
Python の「pip」と「pip3」は何が違うのか?
Pythonを勉強していて気が付きました。
「pip」と「pip3」の違いは何か?
「Python2.7」環境と「Python3.6」環境が同居している場合はどうすればいいのか?
今回の環境は CentOS7 です。
CentOSでは、yumコマンドでパッケージを管理しています。
yum コマンドは Python を利用しているため、デフォルトで Python 2.7 がインストールされています。
[test@test07 ~]$ which yum [test@test07 ~]$ head /usr/bin/yum ← yum コマンドの先頭の10行を読み出します。
[test@test07 ~]$ /usr/bin/python –version |
そのため、デフォルトでインストールされている「Python 2.7」をアンインストールすると yum コマンドが使えなくなって相当大変な思いをすることになります。
pip と pip3 の違いを確認します。
[test@test07 ~]$ which pip3 [test@test07 bin]$ ls -l /usr/bin/pip* |
あれ?
- /usr/bin/pip
- /usr/bin/pip3
- /usr/bin/pip3.6
の3つのファイルは全部同じファイルです。
念のためファイルの中身まで見ます。
[test@test07 bin]$ cat pip # -*- coding: utf-8 -*- from pip import main if __name__ == ‘__main__’:
[test@test07 bin]$ cat pip3 # -*- coding: utf-8 -*- from pip import main if __name__ == ‘__main__’: |
両方の「pip」は「/bin/python3.6」で実行されています。
ちなみに、前回の記事で「Pythonの基本動作」について記事を書きました。
【Python】基本的な動作確認
その際に、pip をインストールする際に以下のコマンドを実行しました。
Python 3.6 で pip をインストールしています。
[test@test07 pip_download]$ sudo python3.6 get-pip.py |
pipのバージョンは「9.0.1」でPythonは「3.6」を利用しています。
[test@test07 pip_download]$ pip -V |
そのため「pip」も「pip3」も「pip3.6」 も Python3.6 を利用してたわけですね。
結論から言えば、「pip」でも「pip3」でも「pip3.6」でも問題なかったということです。
しかも「Python2.7」は利用しないので(yumだけが利用するので)、この環境で問題はありません。
Python仮想環境(virtualenv)は使わない
特に細かく「Python2.7」を利用したり、「Python3.0」を使ったり「Python3.3」でなければ動かない環境を作ったりなどの要件はないため、Python 仮想環境は不要です。
できるだけ環境をシンプルにしておきます。
BeautifulSoupのインストールチェック
BeautiSoupのインストールが完了したらインストールチェックをします。
Pythonインタプリタを利用することで簡単にインストールチェックができます。
[test@test07 bin]$ python3.6 |
BeautSoupでプログラムを作成して実行する
環境が整ったので BeautifulSoup を使って簡単なプログラムを作成します。
[test@test07 Python]$ vi beatifulsoup.py html = urlopen(“http://www.pythonscraping.com/pages/page1.html”) [test@test07 Python]$ |
プログラムは以下のPythonの本を参考にしました。
説明が丁寧なので理解しやすくて参考のプログラムも豊富なのでPython初心者にはお勧めです。
プログラムを実行する
作成したプログラム「beatifulsoup.py」を実行します。
[test@test07 Python]$ python3.6 beatifulsoup.py The code that caused this warning is on line 5 of the file beatifulsoup.py. To get rid of this warning, change code that looks like this:
BeautifulSoup(YOUR_MARKUP})
to this:
BeautifulSoup(YOUR_MARKUP, “html.parser”)
markup_type=markup_type)) |
h1オブジェクトを特定するために「bsObj.h1」と指定しています。
ちなみに、BeautifulSoupの仕様では
- bsObj.html.body.h1
- bsObj.body.h1
- bsObj.html.h1
- bsObj.h1
でも情報が取得できます。
ただし、タグが増えて構造が複雑化すると、取得しようとしたタグと異なるタグを取得してしまうかもしれません。
そのため、できるだけ具体的なパスにした方が正確にタグの情報を取得できます。
ちなみに「bsObj.h1」を「関数呼び出し」と表現します。
プログラムを実行した際のメッセージ
以下のメッセージが気になります。
/usr/lib/python3.6/site-packages/bs4/__init__.py:181: UserWarning: No parser was explicitly specified, so I’m using the best available HTML parser for this system (“html.parser”). This usually isn’t a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.
The code that caused this warning is on line 5 of the file beatifulsoup.py. To get rid of this warning, change code that looks like this: BeautifulSoup(YOUR_MARKUP})
to this:
BeautifulSoup(YOUR_MARKUP, “html.parser”)
markup_type=markup_type)) |
日本語に翻訳すると・・・
/usr/lib/python3.6/site-packages/bs4/__init__.py:181:UserWarning:パーサーが明示的に指定されていないため、このシステムで利用可能な最も優れたHTMLパーサー( “html.parser”)を使用しています。 これは通常問題ではありませんが、別のシステムや別の仮想環境でこのコードを実行すると、別のパーサーを使用して別の動作をする可能性があります。
この警告の原因となったコードは、ファイルbeatifulsoup.pyの5行目にあります。 この警告を取り除くには、次のようなコードを変更します。
BeautifulSoup(YOUR_MARKUP})
to this:
BeautifulSoup(YOUR_MARKUP, “html.parser”)
markup_type=markup_type))
つまりこういうことでしょうか。
from urllib.request import urlopen html = urlopen(“http://www.pythonscraping.com/pages/page1.html”) bsObj = BeautifulSoup(html.read(),”html.parser”) ← 追加します。 |
プログラムを修正して再度実行します。
[test@test07 Python]$ python3.6 beatifulsoup.py |
特にメッセージは出力されませんでした。
まとめ
インフラ系エンジニアですが、Python のプログラミングがおもしろいので上達するように日々勉強します。
Python プログラミングがおもしろい理由は、豊富なライブラリや情報が大量にあるからだと思います。
コメント