【Python3.6】BeautifulSoupのインストール&実行手順

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
Collecting beautifulsoup4
Downloading beautifulsoup4-4.6.0-py3-none-any.whl (86kB)
100% |????????????????????????????????| 92kB 5.9MB/s
Installing collected packages: beautifulsoup4
Successfully installed beautifulsoup4-4.6.0
[test@test07 ~]$

 

 

Python の「pip」と「pip3」は何が違うのか?

Pythonを勉強していて気が付きました。

「pip」「pip3」の違いは何か?

「Python2.7」環境と「Python3.6」環境が同居している場合はどうすればいいのか?

 

今回の環境は CentOS7 です。

CentOSでは、yumコマンドでパッケージを管理しています。

yum コマンドは Python を利用しているため、デフォルトで Python 2.7 がインストールされています。

 

[test@test07 ~]$ which yum
/usr/bin/yum

[test@test07 ~]$ head /usr/bin/yum ← yum コマンドの先頭の10行を読み出します。
#!/usr/bin/python ← 「/usr/bin/python」です。
import sys
try:
import yum
except ImportError:
print >> sys.stderr, """\
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

 

[test@test07 ~]$ /usr/bin/python --version
Python 2.7.5
[test@test07 ~]$

 

そのため、デフォルトでインストールされている「Python 2.7」をアンインストールすると yum コマンドが使えなくなって相当大変な思いをすることになります。

 

pip と pip3 の違いを確認します。

[test@test07 ~]$ which pip3
/usr/bin/pip3
[test@test07 ~]$ which pip
/usr/bin/pip

[test@test07 bin]$ ls -l /usr/bin/pip*
-rwxr-xr-x 1 root root 204 8月 19 08:15 pip
-rwxr-xr-x 1 root root 204 8月 19 08:15 pip3
-rwxr-xr-x 1 root root 204 8月 19 08:15 pip3.6
[test@test07 bin]$ diff pip pip3
[test@test07 bin]$ diff pip pip3.6
[test@test07 bin]$

 

あれ?

  • /usr/bin/pip
  • /usr/bin/pip3
  • /usr/bin/pip3.6

の3つのファイルは全部同じファイルです。

 

念のためファイルの中身まで見ます。

[test@test07 bin]$ cat pip
#!/bin/python3.6

# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(main())
[test@test07 bin]$

 

 

[test@test07 bin]$ cat pip3
#!/bin/python3.6

# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(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 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)

 

そのため「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
Python 3.6.2 (default, Jul 18 2017, 22:59:34)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from bs4 import BeautifulSoup ← この行を入力します。
>>> ← エラーにならなければインストールは正常にできています。
>>> exit()
[test@test07 bin]$

 

 

BeautSoupでプログラムを作成して実行する

環境が整ったので BeautifulSoup を使って簡単なプログラムを作成します。

[test@test07 Python]$ vi beatifulsoup.py
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://www.pythonscraping.com/pages/page1.html")
bsObj = BeautifulSoup(html.read())
print(bsObj.h1)

[test@test07 Python]$

 

プログラムは以下のPythonの本を参考にしました。

説明が丁寧なので理解しやすくて参考のプログラムも豊富なのでPython初心者にはお勧めです。

PythonによるWebスクレイピング

 

 

プログラムを実行する

作成したプログラム「beatifulsoup.py」を実行します。

[test@test07 Python]$ python3.6 beatifulsoup.py
/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))
<h1>An Interesting Title</h1> ← <h1></h1>タグの情報を取得できました。
[test@test07 Python]$

 

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
from bs4 import BeautifulSoup

html = urlopen("http://www.pythonscraping.com/pages/page1.html")
#bsObj = BeautifulSoup(html.read()) ← コメントアウトします。

bsObj = BeautifulSoup(html.read(),"html.parser") ← 追加します。
print(bsObj.h1)

 

プログラムを修正して再度実行します。

[test@test07 Python]$ python3.6 beatifulsoup.py
<h1>An Interesting Title</h1>

 

特にメッセージは出力されませんでした。

 

まとめ

インフラ系エンジニアですが、Python のプログラミングがおもしろいので上達するように日々勉強します。

Python プログラミングがおもしろい理由は、豊富なライブラリや情報が大量にあるからだと思います。

 

PythonによるWebスクレイピング

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人

コメントを残す

メールアドレスが公開されることはありません。