回答編集履歴

4

修正

2018/06/09 08:01

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- - HTMLを削ぎ落とすだけならPHP標準関数の `strip_tags` 関数で十分です。 `$dom->text()` を呼ぶためだけに phpQuery を入れる意味はありません。 phpQuery は本来PHPネイティブの DOMXPath のような機能を実現するためのものです。
9
+ - `$dom->text()` を呼ぶためだけに phpQuery を入れる意味はありません。 phpQuery は本来PHPネイティブの DOMXPath のような機能を実現するためのものです。
10
10
 
11
11
  - (CSSクエリではなくXPathクエリを理解できるのであれば) phpQuery よりも DOMXPath のほうが速い上に余分なコードを書かなくていいので優れています。
12
12
 
@@ -24,9 +24,19 @@
24
24
 
25
25
 
26
26
 
27
+ $html = file_get_contents('https://e.his-j.com/shop/tour/voyage.aspx?portal=02A&jarea=10&tour=TI-CYC0838');
28
+
29
+
30
+
27
31
  $dom = new DOMDocument;
28
32
 
33
+ @$dom->loadHTML(
34
+
29
- @$dom->loadHTMLFile('https://e.his-j.com/shop/tour/voyage.aspx?portal=02A&jarea=10&tour=TI-CYC0838');
35
+ mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII,JIS,UTF-8,eucJP-win,SJIS-win'), // 文字化け対応
36
+
37
+ LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
38
+
39
+ );
30
40
 
31
41
  $xpath = new DOMXPath($dom);
32
42
 
@@ -63,3 +73,49 @@
63
73
 
64
74
 
65
75
  でどうぞ。
76
+
77
+
78
+
79
+ # (追記) 正規表現で対応する場合
80
+
81
+
82
+
83
+ ```php
84
+
85
+ <?php
86
+
87
+
88
+
89
+ $html = file_get_contents('https://e.his-j.com/shop/tour/voyage.aspx?portal=02A&jarea=10&tour=TI-CYC0838');
90
+
91
+
92
+
93
+ // 文字化け対応とテキスト部分のみの抽出
94
+
95
+ $dom = new DOMDocument;
96
+
97
+ @$dom->loadHTML(
98
+
99
+ mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII,JIS,UTF-8,eucJP-win,SJIS-win'),
100
+
101
+ LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
102
+
103
+ );
104
+
105
+ $text = $dom->documentElement->nodeValue;
106
+
107
+
108
+
109
+ if (preg_match('/([\d,]+)\s*円\s*~\s*([\d,]+)\s*円/', $text, $match)) {
110
+
111
+ list(, $min, $max) = array_map('intval', str_replace(',', '', $match));
112
+
113
+ var_dump($min, $max);
114
+
115
+ // int(209800)
116
+
117
+ // int(259800)
118
+
119
+ }
120
+
121
+ ```

3

修正

2018/06/09 08:01

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -2,7 +2,19 @@
2
2
 
3
3
 
4
4
 
5
- **「HTMLタグを削ぎ落とすためだけにサードパーティライブラリを無駄に使って,情報量が削ぎ落とされた中から正規表現で抜き出す」**というのはアプローチとして非常にナンセンスです。今回の目的であればサードパーティライブラリにも正規表現にも頼らずにDOMのまま抜き出すするほうが正解です。
5
+ **「HTMLタグを削ぎ落とすためだけにサードパーティライブラリを使って,情報量が削ぎ落とされた中から正規表現で抜き出す」**というのはアプローチとして非常にナンセンスです。
6
+
7
+
8
+
9
+ - HTMLを削ぎ落とすだけならPHP標準関数の `strip_tags` 関数で十分です。 `$dom->text()` を呼ぶためだけに phpQuery を入れる意味はありません。 phpQuery は本来PHPネイティブの DOMXPath のような機能を実現するためのものです。
10
+
11
+ - (CSSクエリではなくXPathクエリを理解できるのであれば) phpQuery よりも DOMXPath のほうが速い上に余分なコードを書かなくていいので優れています。
12
+
13
+ - HTMLのクラス属性などはスクレイピングのための貴重な情報源なのに,削ぎ落としてしまってテキストしか残っていない状態から正規表現で探し出す,というのは本末転倒です。
14
+
15
+
16
+
17
+ 今回の目的であれば `DOMXPath` が適任です。
6
18
 
7
19
 
8
20
 

2

修正

2018/06/09 06:22

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -38,6 +38,14 @@
38
38
 
39
39
  list($min, $max) = array_map('intval', explode('〜', str_replace(',', '', $price)));
40
40
 
41
+
42
+
43
+ var_dump($min, $max);
44
+
45
+ // int(209800)
46
+
47
+ // int(259800)
48
+
41
49
  ```
42
50
 
43
51
 

1

intで取得

2018/06/09 06:14

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -30,4 +30,16 @@
30
30
 
31
31
 
32
32
 
33
- これだけ。サードパーティライブラリは一切不要です。
33
+ これだけ。サードパーティライブラリは一切不要です。もし価格レンジを数値で取得したいのであれば更に
34
+
35
+
36
+
37
+ ```php
38
+
39
+ list($min, $max) = array_map('intval', explode('〜', str_replace(',', '', $price)));
40
+
41
+ ```
42
+
43
+
44
+
45
+ でどうぞ。