Python初心者です。
PythonにてWebスクレイピングをしておりまして、取得した内容をCSVファイルに書き出すという処理をしたいと考えております。
複数のサイトにアクセスし、複数の項目(次の例では2つ)の内容を取得して、配列に格納し、書き出すプログラムを組んでみたのですが…
Python
1import requests 2from bs4 import BeautifulSoup 3import time 4import os 5import re 6import csv 7from urllib.parse import urljoin 8 9#URL 10url = ["http://hoge.co.jp", \ 11 "http://fuga.co.jp", \ 12 "http://piyo.co.jp" 13 ] 14 15#取得する値(配列) 16arr1 = [] 17arr2 = [] 18 19def scraping() 20 with open("output.csv", "w", errors="ignore") as f: 21 #URLカウンタ(初期化) 22 n = 0 23 while n < len(url) 24 res = requests.get(url[n]) 25 res.raise_for_status() 26 27 #配列カウンタ(初期化) 28 count = 0 29 30 #指定のURLにアクセス 31 html = BeautifulSoup(res.content, "lxml") 32 33 #タグの内容を取得 34 for tmp1 in html.find_all("h3", class_="hoge"): 35 arr1.append([]) 36 arr1[n].append(tmp1.get_text()) 37 38 for tmp2 in html.find_all("p"): 39 for pt in tmp2.find_all("a"): 40 arr2.append([]) 41 arr2[n].append(pt.get("href")) 42 43 #ファイル書き出し 44 f.write(arr1[n][count] + "," + arr2[n][count]) 45 count += 1 46 47 #次のURLへ 48 n+=1 49 50 #ファイルをクローズ 51 f.close() 52 53scraping()
上記のソースコードですと、
f.write(arr1[n][count] + "," + arr2[n][count])のところで、
IndexError: list index out of range
というエラーが起きてしまいます。
おそらく、arr1またはarr2のところで、取得した値がなく、配列に何も追加されず要素がないものを指定したということで起きたエラーなのではないかと思います。(違ってたらすみません)
そこで、if文で、何も取得できなかった場合は、空白("")を配列に追加することでこれを回避しようかと考えております。
結果として、ファイルに書き込まれる内容は、空白(カンマでは区切られる)ですが、エラーで処理が停まるのを防ぐことができるのではないかと考えています。
その場合、上記のようなソースコードですと、どのように指定したらよいのでしょうか。
(arr1の場合ですと、h3タグのクラス名"hoge"がない場合、arr1[n].append("")を処理するif文を追加したいです。)
Pythonはまだ不慣れでして、インデントにも多少の抵抗はあります。(実際エラーが起きて修正することが多々ありますし。)
他にも何かいい方法がありましたら、ご教示いただきますようお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。