A
(以下続く)
```
このHTMLを見ると、関数の名前とURLは以下のようにして取得できそうです。
- テーブル` `を見つける
- 見つけたテーブル内の全ての``要素を見つける
HTMLの構造がわかったところで、もう一度HTMLを解析しているコードを見てみます。
```{index} html.parser
```
```{literalinclude} funcs.py
:caption: WebページをBeautiful Soup 4で解析
:lines: 9-20
```
まず、 `soup.find()` メソッドで、全関数の情報が含まれている テーブルを取得しています。
次に、`find_all()` メソッドを使い、各関数情報(func変数に入っている)から値を取り出しています。
関数名を取得して、出力しています。
## 作り変えてみよう
RequestsやBeautiful Soup 4の動作を変えて、さまざまなWebページから色んな要素を取得できます。
以下にそれぞれのライブラリの簡単な使い方を紹介します。それ以外にもいろいろな使用方法があるので、ドキュメントを参考にしていろいろ作り変えてみてください。
```{index} Requests
```
### Requests の主な使い方
ここでは Requests の主な使い方の例をいくつか載せます。
詳細については以下の公式ドキュメントを参照してください。
* **公式ドキュメント**: [Requests: HTTP for Humans](https://requests.readthedocs.io/)
以下は認証つきのURLにアクセスして、結果を取得する例です。
```{code-block} pycon
:caption: "認証付きURLにアクセスする"
>>> import requests
>>> r = requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>> r.status_code
200
```
```{index} Requests single: Requests; POST
```
POST を行う場合は以下のように、POSTのパラメーターを辞書で定義します。
```{code-block} pycon
:caption: "requests で POST する"
>>> payload = {'key1': 'value1', 'key2': 'value2'} # POST するパラメーター
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> print(r.text)
```
```{index} Requests single: Requests; GET
```
GET に `?key1=value1&key2=value2` のようなパラメーター付きでアクセスする場合も同様に、辞書で定義します。
```{code-block} pycon
:caption: "requests でパラメーター付で GET する"
>>> payload = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get('http://httpbin.org/get', params=payload)
>>> print(r.url)
http://httpbin.org/get?key2=value2&key1=value1
>>> payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> r = requests.get('http://httpbin.org/get', params=payload)
>>> print(r.url)
http://httpbin.org/get?key1=value1&key2=value2&key2=value3
```
### Beautiful Soup 4の主な使い方
ここではBeautiful Soup 4の主な使い方の例をいくつか載せます。
詳細については以下の公式ドキュメントを参照してください。
* **公式ドキュメント**: [Beautiful Soup Documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
```{index} Beautiful Soup 4 single: Beautiful Soup 4; Documentation
```
```{code-block} pycon
:caption: "Beautiful Soup 4の使用例"
>>> import requests
>>> from bs4 import BeautifulSoup
>>> r = requests.get('https://www.python.org/blogs/')
>>> soup = BeautifulSoup(r.content, 'html.parser') # 取得したHTMLを解析
>>> soup.title # titleタグの情報を取得
Our Blogs | Python.org
>>> soup.title.name
'title'
>>> soup.title.string # titleタグの文字列を取得
'Our Blogs | Python.org'
>>> soup.a
Skip to content
>>> len(soup.find_all('a')) # 全ての a タグを取得しt len() で件数を取得
164
```
```{index} find/find_all single: Beautiful Soup 4; find() single: Beautiful Soup 4; find_all()
```
また、 `find()` `find_all()` などでタグを探す場合には、タグの属性などを条件として指定できます。
```{code-block} pycon
:caption: "find/find_all の使用例"
>>> len(soup.find_all('h1')) # 指定したタグを検索
3
>>> len(soup.find_all(['h1', 'h2', 'h3'])) # 複数のタグのいずれかにマッチ
24
>>> len(soup.find_all('h3', {'class': 'event-title'})) # にマッチ
5
```
## まとめ
本節では、Pythonでスクレイピングをする方法を解説しました。
RequestsとBeautiful Soup 4を使いこなすことにより、さまざまなウェブサイトから情報を取得できるようになります。
なお、短時間にWebサイトに大量にアクセスをすると迷惑となるので、そういうことがないようにプログラムを実行するときには注意してください。
## 参考書籍
Pythonでのスクレイピングについてもいくつか書籍が出ています。
- [PythonによるWebスクレイピング](https://www.oreilly.co.jp/books/9784873117614/)
- [Pythonクローリング&スクレイピング ―データ収集・解析のための実践開発ガイド](https://gihyo.jp/book/2017/978-4-7741-8367-1)
- [Pythonによるスクレイピング&機械学習 開発テクニックBeautifulSoup、scikit-learn、TensorFlowを使ってみよう](https://www.socym.co.jp/book/1079)
- [Pythonエンジニア ファーストブック](https://gihyo.jp/book/2017/978-4-7741-9222-2) (第4章 PythonによるWebスクレイピング)
|