Python初心者です。
PythonにてWebスクレイピングをしておりまして、その結果をarr1・arr2に格納し、print関数で表示したいのですが、値が格納されていないため、以下のようなエラーが起こります。
IndexError: list index out of range
例えば、次のようなHTMLがあります。
(説明の便宜上、簡易的なものにしてあります。ご了承くださいませ。)
HTML
1http://hoge.co.jp 2<h3> 3 <a href="http://hoge.co.jp/2001">ダイエット方法</a> 4 <p class="profileName">太郎</p> 5 <a href="http://hoge.co.jp/2002">健康になるには</a> 6 <p class="profileName">次郎</p> 7 <a href="http://hoge.co.jp/2003">美容関連</a> 8 <p class="profileName">和郎</p> 9</h3> 10 11http://fuga.co.jp 12<h3> 13 <a href="http://fuga.co.jp/2001">金運上昇</a> 14 <p class="profileName">一郎</p> 15 <a href="http://fuga.co.jp/2002">健康運上昇</a> 16 <a href="http://fuga.co.jp/2003">恋愛運上昇</a> 17 <p class="profileName">三郎</p> 18</h3> 19 20http://piyo.co.jp 21<h3> 22 <a href="http://piyo.co.jp/2001">音楽</a> 23 <a href="http://piyo.co.jp/2002">美術</a> 24 <p class="profileName">健太</p> 25 <a href="http://piyo.co.jp/2003">書道</a> 26 <p class="profileName">康太</p> 27</h3>
これらをスクレイピングし、出力する結果を以下のようなものにしたいです。
1. ダイエット方法 太郎
2. 健康になるには 次郎
3. 美容関連 和郎
1. 金運上昇 一郎
2. 健康運上昇
3. 恋愛運上昇 三郎
1. 音楽
2. 美術 健太
3. 書道 康太
名前がないものがありますが、それはそれで空白として出力するようにしたいのです。
以下のPythonのコードですと、エラーが起きてしまいます。
Python
1 2#URL 3url = ["http://hoge.co.jp", "http://fuga.co.jp", "http://piyo.co.jp"] 4 5#取得する値(配列) 6arr1 = [] 7arr2 = [] 8 9#URL番号 10n = 0 11 12while n < len(url): 13 c = 0 14 15 html = BeautifulSoup(requests.get(url[n]), "lxml") 16 for hoge in html.find_all("h3"): 17 for at in hoge.find_all("a"): 18 arr1[n].append(at.get_text()) 19 20 for fuga in html.find_all("p", class_="profileName"): 21 arr2[n].append(at.get_text()) 22 23 print(c+1, "\t", arr1[n][c], "\t", arr2[n][c]) 24 c += 1 25 26 n += 1 27
処理の中で、find_allで値を取得できなかったため、arr1またはarr2に値が空なのに、print関数で指定してしまっているために起こるエラーと思われるのですが、ループの途中でエラーが起きて処理が停まってしまうのを何とかしたいと思っています。
例えば、if文でarr1やarr2が空の場合、空白文字をappendする…のような処理ができればと思い、
https://qiita.com/yonedaco/items/d0f65ca3dad2e085a51d
↑こちらを参考にして、
上記のコードの、for文とprint関数の間に、以下のコードを追加してみましたが、こちらもダメでした。
Python
1if len(arr1)==0: 2 arr1.append("") 3 4if len(arr2)==0; 5 arr2.append("")
while文でURLの数だけループ(今回ですと3つなので3回)し、それぞれのURLのデータを取得し、配列arr1、arr2にそれぞれ要素を3つずつ格納させたいです。
上記HTMLでいうと、「健康運上昇」「音楽」のところで名前がありませんが、そのようにデータが取得できなかった場合も、空白として配列に格納するには、どのようにすればよろしいでしょうか。
調べてはいるのですが、なかなかできずに困っています。
詳しい方のご教示をお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。