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

質問編集履歴

4

追記の表示を追加しました

2020/05/07 10:34

投稿

begenner
begenner

スコア80

title CHANGED
File without changes
body CHANGED
@@ -65,7 +65,7 @@
65
65
  ```
66
66
 
67
67
  ## コード
68
- ### スクレイピングするHTML
68
+ ### スクレイピングするHTML(整形)
69
69
  - sample.html
70
70
  ```html
71
71
  <div class="list">
@@ -93,7 +93,7 @@
93
93
  ```
94
94
 
95
95
 
96
- ### 修正したコード(Ruby)
96
+ ### 追記:修正したコード(Ruby)
97
97
  ```ruby
98
98
  require 'mechanize'
99
99
 

3

コードの順番を変更しました

2020/05/07 10:34

投稿

begenner
begenner

スコア80

title CHANGED
File without changes
body CHANGED
@@ -93,7 +93,7 @@
93
93
  ```
94
94
 
95
95
 
96
- ### 修正したコード
96
+ ### 修正したコード(Ruby)
97
97
  ```ruby
98
98
  require 'mechanize'
99
99
 
@@ -102,22 +102,6 @@
102
102
  page = agent.get(url)
103
103
  html_infos = page.search('.aaa')
104
104
 
105
- extracted_datas = []
106
- html_infos.each do |ele|
107
- extracted_datas << ele.inner_text
108
- end
109
- ```
110
-
111
- ### 現状のコード
112
- - main.rb
113
- ```ruby
114
- require 'mechanize'
115
-
116
- agent = Mechanize.new
117
- # sample.html のコードが含まれるurlから情報を取得
118
- page = agent.get(url)
119
- html_infos = page.search('.aaa')
120
-
121
105
  foo = page.xpath("//div[@class='aaa']//text()")
122
106
  bar = page.xpath("//div[@class='aaa']/span[@class="bbb"]//text()")
123
107
  extracted_datas = (foo - bar).map{|x| x.text.strip}.select{|x| x!=""}
@@ -138,4 +122,19 @@
138
122
  # "yyy",
139
123
  # "zzz"
140
124
  #]
125
+ ```
126
+
127
+ ### 現状のコード
128
+ ```ruby
129
+ require 'mechanize'
130
+
131
+ agent = Mechanize.new
132
+ # sample.html のコードが含まれるurlから情報を取得
133
+ page = agent.get(url)
134
+ html_infos = page.search('.aaa')
135
+
136
+ extracted_datas = []
137
+ html_infos.each do |ele|
138
+ extracted_datas << ele.inner_text
139
+ end
141
140
  ```

2

回答を参考にrubyファイルを修正、HTMLを変更、修正。 取得される配列を掲載

2020/05/07 10:33

投稿

begenner
begenner

スコア80

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,12 @@
1
1
  現在某サイトを利用してスクレイピングの勉強をしています。
2
2
  少しは理解できたと思うのですが、
3
3
  下記のHTMLコードから
4
- - `<div class="aaa">`タグ内のテキスト(3件 - xxx、yyy、zzz)を抽出したい
4
+ - `<div class="aaa">`タグ内のテキスト(3件 - ooopppqqq、yyy、zzz)を抽出したい
5
5
  - `<span class="bbb">`タグ内のテキスト(α、β、θ)は抽出したくない
6
+ - 1件目は一番難儀で`α`は不要、`ooo`、aタグ内のテキスト`ppp`、aタグ直後の`qqq`を連結した`ooopppqqq`を取得したい
7
+ - 2、3件目は`yyy`、`zzz`を取得したい
6
8
 
9
+
7
10
  といった場合のコードの書き方が全くわかりません(m_ _m)
8
11
  もしわかる方がいらっしゃればご教授いただきますようよろしくお願いいたします(m_ _m)
9
12
 
@@ -12,17 +15,20 @@
12
15
  <ol>
13
16
  <li>
14
17
  <div class="aaa">
15
- <span class="bbb">α</span>xxx
18
+ <span class="bbb">α</span>
19
+ ooo<a href="site_url">ppp</a>qqq
16
20
  </div>
17
21
  </li>
18
22
  <li>
19
23
  <div class="aaa">
20
- <span class="bbb">β</span>yyy
24
+ <span class="bbb">β</span>
25
+ yyy
21
26
  </div>
22
27
  </li>
23
28
  <li>
24
29
  <div class="aaa">
25
- <span class="bbb">θ</span>zzz
30
+ <span class="bbb">θ</span>
31
+ zzz
26
32
  </div>
27
33
  </li>
28
34
  </ol>
@@ -37,49 +43,99 @@
37
43
  |Mechanize|2.7.6|
38
44
 
39
45
  ### 期待する動作
40
- - `<div class="aaa">`タグ内のテキスト(3件 - xxx、yyy、zzz)を抽出したい
46
+ - `<div class="aaa">`タグ内のテキスト(3件 - ooopppqqq、yyy、zzz)を抽出したい
41
47
  - `<span class="bbb">`タグ内のテキスト(α、β、θ)は抽出したくない
42
-
43
- ### 現状コード
48
+ - 1件目は一番難儀で`α`は不要、`ooo`、aタグ内テキスト`ppp`、aタグ直後の`qqq`を連結した`ooopppqqq`を取得したい
44
- - main.rb
49
+ - 2、3件目は`yyy`、`zzz`を取得したい
45
50
  ```ruby
46
- require 'mechanize'
47
-
48
- agent = Mechanize.new
51
+ # 現状だと下記のようにデータが取得されます
52
+ #[
49
- # sample.html のコードが含まれるurlから情報を取得
53
+ # "ooo",
54
+ # "qqq",
55
+ # "yyy",
50
- page = agent.get(url)
56
+ # "zzz"
51
- html_infos = page.search('.aaa')
57
+ #]
52
58
 
53
- extracted_datas = []
54
- html_infos.each do |ele|
55
- extracted_datas << ele.inner_text
56
- end
57
-
58
- # 現状だと下記のようにデータが抽出されます
59
+ # 理想は下記のようにデータが取得されること
59
- # α xxx
60
+ #[
61
+ # "ooopppqqq",
60
- # β yyy
62
+ # "yyy",
61
- # θ zzz
63
+ # "zzz"
64
+ #]
62
65
  ```
63
66
 
67
+ ## コード
68
+ ### スクレイピングするHTML
64
69
  - sample.html
65
70
  ```html
66
71
  <div class="list">
67
72
  <ol>
68
73
  <li>
69
74
  <div class="aaa">
70
- <span class="bbb">α</span>xxx
75
+ <span class="bbb">α</span>
76
+ ooo<a href="site_url">ppp</a>qqq
71
77
  </div>
72
78
  </li>
73
79
  <li>
74
80
  <div class="aaa">
75
- <span class="bbb">β</span>yyy
81
+ <span class="bbb">β</span>
82
+ yyy
76
83
  </div>
77
84
  </li>
78
85
  <li>
79
86
  <div class="aaa">
80
- <span class="bbb">θ</span>zzz
87
+ <span class="bbb">θ</span>
88
+ zzz
81
89
  </div>
82
90
  </li>
83
91
  </ol>
84
92
  </div>
93
+ ```
94
+
95
+
96
+ ### 修正したコード
97
+ ```ruby
98
+ require 'mechanize'
99
+
100
+ agent = Mechanize.new
101
+ # sample.html のコードが含まれるurlから情報を取得
102
+ page = agent.get(url)
103
+ html_infos = page.search('.aaa')
104
+
105
+ extracted_datas = []
106
+ html_infos.each do |ele|
107
+ extracted_datas << ele.inner_text
108
+ end
109
+ ```
110
+
111
+ ### 現状のコード
112
+ - main.rb
113
+ ```ruby
114
+ require 'mechanize'
115
+
116
+ agent = Mechanize.new
117
+ # sample.html のコードが含まれるurlから情報を取得
118
+ page = agent.get(url)
119
+ html_infos = page.search('.aaa')
120
+
121
+ foo = page.xpath("//div[@class='aaa']//text()")
122
+ bar = page.xpath("//div[@class='aaa']/span[@class="bbb"]//text()")
123
+ extracted_datas = (foo - bar).map{|x| x.text.strip}.select{|x| x!=""}
124
+
125
+ p extracted_datas
126
+
127
+ # 現状だと下記のようにデータが取得されます
128
+ #[
129
+ # "ooo",
130
+ # "qqq",
131
+ # "yyy",
132
+ # "zzz"
133
+ #]
134
+
135
+ # 理想は下記のようにデータが取得されること
136
+ #[
137
+ # "ooopppqqq",
138
+ # "yyy",
139
+ # "zzz"
140
+ #]
85
141
  ```

1

質問に関するタグを追加しました

2020/05/07 10:32

投稿

begenner
begenner

スコア80

title CHANGED
File without changes
body CHANGED
File without changes