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

回答編集履歴

5

補足

2018/02/21 12:23

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -81,4 +81,47 @@
81
81
  2,get_data
82
82
  3,main
83
83
 
84
- こうすることで、関数内と渡すパラメータだけ意識すればよくなり影響範囲が少なくなります。
84
+ こうすることで、関数内と渡すパラメータだけ意識すればよくなり影響範囲が少なくなります。
85
+
86
+ python 3バージョンのソースコードです。
87
+ ```Python
88
+ # -*- coding: utf8 -*-
89
+ import urllib.request
90
+ from bs4 import BeautifulSoup
91
+
92
+
93
+ def get_content(url:str):
94
+ """
95
+ @params url スクレイピング対象のURL
96
+ """
97
+ with urllib.request.urlopen(url) as response:
98
+ return BeautifulSoup(response.read(), "html.parser")
99
+
100
+
101
+ def get_data(soup) -> str:
102
+ i = 0
103
+ for parent in soup.find('div', {'class': 'race_otherdata'}):
104
+ data = parent.string.rstrip()
105
+ if len(data) == 0:
106
+ continue
107
+ if i == 2:
108
+ # 本賞金以降はSkip
109
+ continue
110
+ yield data
111
+ i += 1
112
+
113
+
114
+ def main() -> None:
115
+ url = 'http://race.netkeiba.com/?pid=race_old&id=p201805010301'
116
+ soup = get_content(url)
117
+ # python 3なのでcodec.openは不要
118
+ with open('tokyo_race_1.csv', 'w', encoding='utf-8') as f:
119
+ f.write('other_race_name' + u"\n")
120
+ for row in get_data(soup):
121
+ print(row)
122
+ f.write(row + "\n")
123
+
124
+
125
+ if __name__ == '__main__':
126
+ main()
127
+ ```

4

追記

2018/02/21 12:23

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -61,4 +61,24 @@
61
61
 
62
62
  ■余談
63
63
  このコードを記述する時に一番時間がかかった点は`python 2.7`環境での`unicode`文字列の変換部分でした。
64
- 制約事項などがない場合は`python 3`環境に移行することをおすすめいたします。
64
+ 制約事項などがない場合は`python 3`環境に移行することをおすすめいたします。
65
+
66
+ ---
67
+
68
+ 質問文のソースコードは回答した内容が一切反映されていないソースコードなのですが・・・その点。
69
+
70
+ まず、スクリプトの各変数の影響範囲を少なくすることを考えてくださいな。
71
+ 質問文の改訂されたソースコードだと、どの箇所が問題になっているか、一瞬では原因究明が行えないと思います。
72
+
73
+ それは、以下の3つの処理を一つのスクリプト内で行っているからです。
74
+
75
+ 1,WEBサイトからスクレイピング
76
+ 2,スクレイピングしたデータをタグを指定して該当部分を抽出
77
+ 3,抽出した内容をcsvファイルに書き出し。
78
+
79
+ こういう時は回答文のソースコードのように3つに関数を分割化を行います。
80
+ 1,get_content
81
+ 2,get_data
82
+ 3,main
83
+
84
+ こうすることで、関数内と渡すパラメータだけ意識すればよくなり影響範囲が少なくなります。

3

追記

2018/02/21 12:15

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -5,8 +5,8 @@
5
5
 
6
6
 
7
7
  このメッセージが発生する条件は以下の2パターンが多いです。
8
- パターン1,値がNoneの変数に対して関数を呼び出そうとした。
8
+ パターン1,値が`None`の変数に対して関数を呼び出そうとした。
9
- soup_1.find('div',{'class':'race_otherdata'})の戻り値がNoneで、それに対して.findall()関数をよびだそうとした
9
+ 質問文の場合はsoup_1.find('div',{'class':'race_otherdata'})の戻り値が`None`で、それに対して.findall()関数をよびだそうとした
10
10
  パターン2,呼び出し関数のスペルミス。今回の場合はこちらです。
11
11
  |○/×|関数名|
12
12
  |:--|:--:|
@@ -60,5 +60,5 @@
60
60
  [Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)](http://kondou.com/BS4/)
61
61
 
62
62
  ■余談
63
- このコードを記述する時に一番時間がかかった点はpython 2.7環境でのunicode文字列の変換部分でした。
63
+ このコードを記述する時に一番時間がかかった点は`python 2.7`環境での`unicode`文字列の変換部分でした。
64
- 制約事項などがない場合はpython 3環境に移行することをおすすめいたします。
64
+ 制約事項などがない場合は`python 3`環境に移行することをおすすめいたします。

2

補足

2018/02/21 00:48

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -4,12 +4,16 @@
4
4
  TypeError: 'NoneType'オブジェクトは呼び出し可能ではありません
5
5
 
6
6
 
7
- このメッセージが発生する条件は
7
+ このメッセージが発生する条件は以下の2パターンが多いです。
8
+ パターン1,値がNoneの変数に対して関数を呼び出そうとした。
8
- 1,soup_1.find('div',{'class':'race_otherdata'})の戻り値がNoneで、それに対して.findall()をよびだそうとした
9
+ soup_1.find('div',{'class':'race_otherdata'})の戻り値がNoneで、それに対して.findall()関数をよびだそうとした
9
- 2,今回の場合はこちら 呼び出し関数のスペルミス。.findall => .find_all
10
+ パターン2,呼び出し関数のスペルミス。今回の場合はこちらです。
11
+ |○/×|関数名|
12
+ |:--|:--:|
13
+ |×|.findall|
14
+ |○|.find_all|
10
15
 
11
-
16
+ ---
12
-
13
17
  2行目の値も取り出したいとのことなので以下のソースコードでご要望の処理になりますか?
14
18
 
15
19
  ```Python

1

追記

2018/02/21 00:27

投稿

umyu
umyu

スコア5846

answer CHANGED
@@ -1,5 +1,17 @@
1
- こんな感じでしょうか?
1
+ > TypeError: 'NoneType' object is not callable
2
2
 
3
+ ぐーぐる翻訳
4
+ TypeError: 'NoneType'オブジェクトは呼び出し可能ではありません
5
+
6
+
7
+ このメッセージが発生する条件は
8
+ 1,soup_1.find('div',{'class':'race_otherdata'})の戻り値がNoneで、それに対して.findall()をよびだそうとした
9
+ 2,今回の場合はこちら 呼び出し関数のスペルミス。.findall => .find_all
10
+
11
+
12
+
13
+ 2行目の値も取り出したいとのことなので以下のソースコードでご要望の処理になりますか?
14
+
3
15
  ```Python
4
16
  # -*- coding: utf8 -*-
5
17
  import urllib2
@@ -39,6 +51,10 @@
39
51
  if __name__ == '__main__':
40
52
  main()
41
53
  ```
54
+
55
+ ■参考情報
56
+ [Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)](http://kondou.com/BS4/)
57
+
42
58
  ■余談
43
59
  このコードを記述する時に一番時間がかかった点はpython 2.7環境でのunicode文字列の変換部分でした。
44
60
  制約事項などがない場合はpython 3環境に移行することをおすすめいたします。