pythonでスクレイピングしたデータをCSVに格納する

スクレイピングや機械学習で注目されているpythonがどこまで手軽にできるのか
ちょっと試してみた。

参考文献

PythonによるWebスクレイピング
O’REILLY
オライリー・ジャパン

システム要件

https://en.wikipedia.org/wiki/Comparison_of_text_editors
の最初に現れる表の内容を取得しCSVに保存する。

実装例

事前にBeautifulSoupをinstallすること。
コード:適当な名前で作成し、シェルから
python [作成したファイル名].py で実行する。

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen('https://en.wikipedia.org/wiki/Comparison_of_text_editors')
bs = BeautifulSoup(html, 'html.parser')

table = bs.findAll('table', {'class':'wikitable'})[0]
rows = table.findAll('tr') csvFile = open('editors.csv', 'wt+')

writer = csv.writer(csvFile)
try:
    for row in rows:
        csvRow = []
        for cell in row.findAll(['td', 'th']):
            csvRow.append(cell.get_text())
            writer.writerow(csvRow)
finally:
    csvFile.close()

 

実行結果

editors.csvが実行したプログラムと同じ場所へ書き出される。
Excel(2007以降)のデータ→外部データ取り込み→テキストファイル→インポートしてみるが、改行制御コードがどうやら怪しく
期待通りに取り込めなかった。
writerowメソッドで配列をテキストに変換してファイルへ追加してるので、ここらに何か起きている。

コード修正

テーブルセルの中に改行があったので取り除いたところ、ほぼ期待するCSVで出力されました。

import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup

# 文末の改行を除去する
def cleanRN(str):
    if str != None:
        return str.rstrip('\r\n')
    else:
        return str

html = urlopen('https://en.wikipedia.org/wiki/Comparison_of_text_editors')
bs = BeautifulSoup(html, 'html.parser')

table = bs.findAll('table', {'class':'wikitable'})[0]
rows = table.findAll('tr')

csvFile = open('editors.csv', 'wt+', newline='')
writer = csv.writer(csvFile, dialect='excel') # dialect='excel'を追加

try:
    for row in rows:
        csvRow = []
        for cell in row.findAll(['td', 'th']):
            csvRow.append(cleanRN(cell.get_text()))
        writer.writerow(csvRow)
finally:
    csvFile.close()

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です