初めてスクレイピングをしようとしています。
色々なサイトを参考に何とか動くようにはなりましたが、想定通りの結果にならず躓いています。
よろしくお願いします。
前提・実現したいこと
あるサイトからテーブルの内容をスクレイピングし、csv出力したいです。
リンク内容
テーブルの一部カラムが欠損しているのがネックなようで思ったような取得結果になりません。
サイトには下記のようなテーブルが複数あります。
同じ機械の場合、機械欄はブランクとなっています。
機械 | メーカー | 数量 |
---|---|---|
機械A | abc | 1 |
機械B | bbb | 1 |
ccc | 3 | |
ddd | 2 | |
eee | 5 | |
fff | 1 |
最終的に取得したい結果は下記のようなcsvです
csv
1機械,メーカー,数量 2機械A,abc,1 3機械B,bbb,1 4機械B,ccc,1 5機械B,ddd,2 6機械B,eee,5 7機械B,fff,1
発生している問題・エラーメッセージ
試してみたところ、こんな形式で出力されてしまいました。
csv
1機械種別,メーカー,数量,機械A,abc,1,機械B,bbb,1,ccc,1,ddd,2,eee,5,fff,1
該当のソースコード
python
1from bs4.element import Tag 2import requests 3from bs4 import BeautifulSoup 4import csv 5 6url = 'https://xxxxxxx' 7# リクエスト 8res = requests.get(url) 9# エンコーディング 10res.encoding = res.apparent_encoding 11# htmlをパース 12soup = BeautifulSoup(res.text, "html.parser") 13# データ取得 14tables = soup.find_all(class_="tbl-data-01") 15file = 'C:/xxxxxxx/result.csv' 16with open(file, "a", encoding='utf-8') as file: 17 writer = csv.writer(file) 18 for table in tables: 19 rows = table.findAll("tbody") 20 for row in rows: 21 csvRow = [] 22 for cell in row.findAll(['td', 'th']): 23 print(cell.text) 24 csvRow.append(cell.get_text()) 25 if len(csvRow) > 0: 26 writer.writerow(csvRow)
試したこと
上記のコードの前に下記でやってみたところ、各機械の1行目しか取れませんでした。
HTMLのソースを眺めていてtbody
でfind_all
した方が良さそうだと検討をつけて
上記のコードになりました。
python
1from bs4.element import Tag 2import requests 3from bs4 import BeautifulSoup 4import csv 5 6url = 'https://xxxxxxx' 7# リクエスト 8res = requests.get(url) 9# エンコーディング 10res.encoding = res.apparent_encoding 11# htmlをパース 12soup = BeautifulSoup(res.text, "html.parser") 13tables = soup.find_all(class_="tbl-data-01") 14file = 'C:/xxxxxxx/result.csv' 15with open(file, "a", encoding='utf-8') as file: 16 writer = csv.writer(file) 17 for table in tables: 18 #print(table.tbody) 19 rows = table.findAll("tr") 20 for row in rows: 21 csvRow = [] 22 for cell in row.findAll(['td', 'th']): 23 print(cell.text) 24 csvRow.append(cell.get_text()) 25 if len(csvRow) > 0: 26 writer.writerow(csvRow)
このコードで取得できたのが下記の結果です
csv
1機械,メーカー,数量 2機械A,abc,1 3機械B,bbb,1
補足情報(FW/ツールのバージョンなど)
python 3.8.1
vscode 1.48.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/02 07:24
2020/12/02 08:39 編集
2020/12/02 08:03
2020/12/02 10:27
2020/12/03 01:27