【Python】Beautiful Soupを使ってローカルのhtmlファイルをスクレイピングしてCSV出力する方法

# はじめに

ローカルのhtmlファイルからテキストデータをスクレイピングしたいと考え、いろいろと試したのですがPythonのライブラリのBeautiful Soupがとても便利だったので使い方とCSVファイルへの出力方法をシェアします。

# 開発環境

pyenv: 1.2.15
python: 3.6.5
Beautiful Soup: 4.4.0
VSCode: 1.41.1

# Pythonの環境構築

環境構築はProgateの下記レッスンを参考にさせていただきました。
[Pythonの開発環境を用意しよう！（Mac)](https://prog-8.com/docs/python-env)

# Beautiful Soupとは？

Pythonのライブラリの一種でHTMLデータからHTMLタグやCSSセレクタを基準に
スクレイピングが実行できます。
公式リファレンス： https://www.crummy.com/software/BeautifulSoup/bs4/doc/
リファレンス和訳(ver 3.0)： https://tdoc.info/beautifulsoup/

# Beautiful Soupの導入
[pip](https://ja.wikipedia.org/wiki/Pip)を用いてインストールします。
下記の記事を参考にさせていただきました。

[【Python入門】pipとは？使い方をわかりやすく解説！](https://www.sejuku.net/blog/50417)
[Pythonのbeautifulsoupでスクレイピングをしてみよう](https://www.sejuku.net/blog/75137)

下記のコマンドでインストールできます。

```python
pip install beautifulsoup4
```

# htmlファイルの準備

スクレイピング対象のhtmlファイルをローカルに準備します。
以下はサンプルファイルです。

```/sample_file/sample.html
<!-- 〜省略〜 -->
<div>
  <ul lass="sample">
    <li class="sample">
      <a href="aaa">aaaaaa</a>
    </li>
    <li class="sample">
      <a href="bbb">bbbbb</a>
    </li>
  </ul>
  <div class="sample">
    <a href="ccc">ccc</a>
  </div>
  <div class="sample">
    <div class="sample">
        <a href="ddd">ddddd</a>
    </div>
  </div>
</div>
<!-- 〜省略〜 -->
```

# スクレイピング作業
### Pythonファイルの作成

次にPythonのプログラムを作成します。htmlファイルと同じディレクトリに作ってください。

```/sample_file/script.py
import bs4
import csv # モジュール"CSV"の呼び出し

# スクレイピング対象のhtmlファイルからsoupを作成
soup = bs4.BeautifulSoup(open('sample.html'), 'html.parser')

links = soup.find_all('a') # 全てのaタグ要素を取得

csvlist = [] # 配列を作成

for link in links: # aタグのテキストデータを配列に格納
    sample_txt = link.text
    csvlist.append(sample_txt)

# CSVファイルを開く。ファイルがない場合は新規作成
f = open("output_sample.csv", "w")
writecsv = csv.writer(f, lineterminator='\n')

writecsv.writerow(csvlist) # 出力

f.close() # CSVファイルを閉じる
```

下記の記事を参考にさせていただきました。

[Python で HTML をパースする (Beautiful Soup)](https://maku77.github.io/python/parse-html-by-beautiful-soup.html)
[BeautifulSoupでスクレイピングしたHTMLをCSVに出力する](https://5log.hateblo.jp/entry/2019/01/03/075552)

### Pythonファイルの実行

```
$ cd sample_file
$ python script.py
```

### 出力結果

同じディレクトリに以下のようにCSVファイルが出力されます。

```output_sample.csv
aaaaaa,bbbbb,ccc,ddddd
```

### CSVの処理
#### 1. CSVファイルの可読性向上
もしVSCodeを使用している場合、Rainbow CSVという拡張機能を導入するとCSVがとても見やすくなります。

*before*

<img width="362" alt="スクリーンショット 2020-01-05 10.12.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481946/88dc282e-9a3e-8d7b-1fb6-66c2b4836fad.png">

*after*
<img width="362" alt="スクリーンショット 2020-01-05 10.12.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481946/00513319-ef97-8fc3-b135-87124aff8a9c.png">

Rainbow CSVの導入は下記記事を参考にさせていただきました。
[VSCodeでCSVをステキに見やすくする「Rainbow CSV」を紹介するよ](https://qiita.com/0w0/items/07a481921a2ac09a049f)

#### 2. seedデータ用に処理

上記方法でスクレイピングするとたくさんの改行が入る場合があります。
CSVファイルをseedデータなどで配列の中身として使用したい場合に
改行を消して一行にしたい場合があります。
そのような時はVSCodeの置換機能で改行を一括削除する方法がおすすめです。
![970a4afb7683f49554298fc9937affa6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481946/f99892a8-5af3-2956-dcef-9db6ab0eebbb.gif)
この方法が下記の記事を参考にさせていただきました。
[【VisualStudioCode】改行コードを置換して1行にする方法]
(https://kukka.me/vsc-newline/)

# まとめ

Beautiful Soupでスクレイピングが実行できます。
モジュール"CSV"を用いるとCSVファイル出力ができます。
htmlファイルの構成によってCSVファイルにたくさんの改行が入ってしまう場合、
VSCodeの置換機能が便利です。


# 参考URL
https://prog-8.com/docs/python-env
https://www.crummy.com/software/BeautifulSoup/bs4/doc/
https://www.sejuku.net/blog/50417
https://www.sejuku.net/blog/75137
https://maku77.github.io/python/parse-html-by-beautiful-soup.html
https://5log.hateblo.jp/entry/2019/01/03/075552
https://qiita.com/0w0/items/07a481921a2ac09a049f
https://kukka.me/vsc-newline/