teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

HTMLと出力したい結果を掲載し、説明文も追記しました。

2019/06/23 10:29

投稿

umai29
umai29

スコア19

title CHANGED
File without changes
body CHANGED
@@ -1,10 +1,56 @@
1
1
  Python初心者です。
2
2
 
3
- PythonにてWebスクレイピングをしておりまして、その結果をarrに格納し、print関数で表示したいのですが、
3
+ PythonにてWebスクレイピングをしておりまして、その結果をarr1・arr2に格納し、print関数で表示したいのですが、値が格納されていないため、以下のようなエラーが起こります。
4
- 値が格納されていないため、以下のようなエラーが起こります。
5
4
 
6
5
  IndexError: list index out of range
7
6
 
7
+ 例えば、次のようなHTMLがあります。
8
+ (説明の便宜上、簡易的なものにしてあります。ご了承くださいませ。)
9
+
10
+ ```HTML
11
+ http://hoge.co.jp
12
+ <h3>
13
+ <a href="http://hoge.co.jp/2001">ダイエット方法</a>
14
+ <p class="profileName">太郎</p>
15
+ <a href="http://hoge.co.jp/2002">健康になるには</a>
16
+ <p class="profileName">次郎</p>
17
+ <a href="http://hoge.co.jp/2003">美容関連</a>
18
+ <p class="profileName">和郎</p>
19
+ </h3>
20
+
21
+ http://fuga.co.jp
22
+ <h3>
23
+ <a href="http://fuga.co.jp/2001">金運上昇</a>
24
+ <p class="profileName">一郎</p>
25
+ <a href="http://fuga.co.jp/2002">健康運上昇</a>
26
+ <a href="http://fuga.co.jp/2003">恋愛運上昇</a>
27
+ <p class="profileName">三郎</p>
28
+ </h3>
29
+
30
+ http://piyo.co.jp
31
+ <h3>
32
+ <a href="http://piyo.co.jp/2001">音楽</a>
33
+ <a href="http://piyo.co.jp/2002">美術</a>
34
+ <p class="profileName">健太</p>
35
+ <a href="http://piyo.co.jp/2003">書道</a>
36
+ <p class="profileName">康太</p>
37
+ </h3>
38
+ ```
39
+
40
+ これらをスクレイピングし、出力する結果を以下のようなものにしたいです。
41
+ 1.  ダイエット方法  太郎
42
+ 2.  健康になるには  次郎
43
+ 3.  美容関連  和郎
44
+ 1.  金運上昇  一郎
45
+ 2.  健康運上昇  
46
+ 3.  恋愛運上昇  三郎
47
+ 1.  音楽  
48
+ 2.  美術  健太
49
+ 3.  書道  康太
50
+
51
+ 名前がないものがありますが、それはそれで空白として出力するようにしたいのです。
52
+ 以下のPythonのコードですと、エラーが起きてしまいます。
53
+
8
54
  ```Python
9
55
 
10
56
  #URL
@@ -14,18 +60,23 @@
14
60
  arr1 = []
15
61
  arr2 = []
16
62
 
63
+ #URL番号
17
64
  n = 0
65
+
18
- while n < 3:
66
+ while n < len(url):
67
+ c = 0
68
+
19
69
  html = BeautifulSoup(requests.get(url[n]), "lxml")
20
70
  for hoge in html.find_all("h3"):
21
71
  for at in hoge.find_all("a"):
22
- arr1.append(at.get_text())
72
+ arr1[n].append(at.get_text())
23
73
 
24
- for fuga in html.find_all("h4"):
74
+ for fuga in html.find_all("p", class_="profileName"):
25
- for at in fuga.find_all("a"):
26
- arr2.append(at.get_text())
75
+ arr2[n].append(at.get_text())
27
76
 
28
- print(arr1[n], "\t", arr2[n])
77
+ print(c+1, "\t", arr1[n][c], "\t", arr2[n][c])
78
+ c += 1
79
+
29
80
  n += 1
30
81
 
31
82
  ```
@@ -47,8 +98,8 @@
47
98
  arr2.append("")
48
99
  ```
49
100
 
50
- while文で3回ループし、3つのURLのデータを取得し、配列arr1、arr2にそれぞれ要素を3つずつ格納させたいです。
101
+ while文でURLの数だけループ(今回ですと3つで3回)し、それぞれのURLのデータを取得し、配列arr1、arr2にそれぞれ要素を3つずつ格納させたいです。
51
- 例えば3回中2回目ループで、データが取得できなかった場合も、空白として配列に格納するには、どのようにすればよろしいでしょうか。
102
+ 上記HTMLでいうと「健康運上昇」「音楽」ところ名前がありませんがそのようにデータが取得できなかった場合も、空白として配列に格納するには、どのようにすればよろしいでしょうか。
52
103
 
53
104
  調べてはいるのですが、なかなかできずに困っています。
54
105
  詳しい方のご教示をお願い致します。