質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

1回答

3694閲覧

【Python】find_allで値を取得できない際、配列要素に空白を追加したい。

umai29

総合スコア19

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/06/23 12:38

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#URL 2url = ["http://hoge.co.jp", "http://fuga.co.jp", "http://piyo.co.jp"] 3 4#取得する値(配列) 5arr1 = [] 6arr2 = [] 7 8#URL番号 9n = 0 10 11while n < len(url): 12 c = 0 13 14 html = BeautifulSoup(requests.get(url[n]), "lxml") 15 for hoge in html.find_all("h3"): 16 for at in hoge.find_all("a"): 17 arr1[n].append(at.get_text()) 18 19 for fuga in html.find_all("p", class_="profileName"): 20 arr2[n].append(at.get_text()) 21 22 print(c+1, "\t", arr1[n][c], "\t", arr2[n][c]) 23 c += 1 24 25 n += 1

処理の中で、find_allで値を取得できなかったため、arr1またはarr2に値が空なのに、print関数で指定してしまっているために起こるエラーと思われるのですが、ループの途中でエラーが起きて処理が停まってしまうのを何とかしたいと思っています。

例えば、if文でarr1やarr2が空の場合、空白文字をappendする…のような処理ができればと思い、

https://qiita.com/yonedaco/items/d0f65ca3dad2e085a51d
↑こちらを参考にして、

上記のコードの、for文とprint関数の間に、以下のコードを追加してみましたが、こちらもダメでした。

Python

1if len(arr1[n][c])==0: 2 arr1.append("") 3 4if len(arr2[n][c])==0; 5 arr2.append("")

while文でURLの数だけループ(今回ですと3つなので3回)し、それぞれのURLのデータを取得し、配列arr1、arr2にそれぞれ要素を3つずつ格納させたいです。
上記HTMLでいうと、「健康運上昇」「音楽」のところで名前がありませんが、そのようにデータが取得できなかった場合も、空白として配列に格納するには、どのようにすればよろしいでしょうか。

調べてはいるのですが、なかなかできずに困っています。
詳しい方のご教示をお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

まずaタグを抽出
aタグの次のタグがpでかつclassがprofileNameの場合はget_text()
違う場合はNone

python

1for i in soup.find_all("a"): 2 3 result = [] 4 5 result.append(i.get_text()) 6 7 j = i.find_next() 8 9 if j: 10 if j.name == "p" and j.get("class") == ["profileName"]: 11 result.append(j.get_text()) 12 else: 13 result.append(None) 14 else: 15 result.append(None) 16 17 print(result)

投稿2019/06/24 14:07

編集2019/06/24 14:17
barobaro

総合スコア1286

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問