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

回答編集履歴

4

修正

2018/06/09 08:01

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **「HTMLタグを削ぎ落とすためだけにサードパーティライブラリを使って,情報量が削ぎ落とされた中から正規表現で抜き出す」**というのはアプローチとして非常にナンセンスです。
4
4
 
5
- - HTMLを削ぎ落とすだけならPHP標準関数の `strip_tags` 関数で十分です。 `$dom->text()` を呼ぶためだけに phpQuery を入れる意味はありません。 phpQuery は本来PHPネイティブの DOMXPath のような機能を実現するためのものです。
5
+ - `$dom->text()` を呼ぶためだけに phpQuery を入れる意味はありません。 phpQuery は本来PHPネイティブの DOMXPath のような機能を実現するためのものです。
6
6
  - (CSSクエリではなくXPathクエリを理解できるのであれば) phpQuery よりも DOMXPath のほうが速い上に余分なコードを書かなくていいので優れています。
7
7
  - HTMLのクラス属性などはスクレイピングのための貴重な情報源なのに,削ぎ落としてしまってテキストしか残っていない状態から正規表現で探し出す,というのは本末転倒です。
8
8
 
@@ -11,8 +11,13 @@
11
11
  ```php
12
12
  <?php
13
13
 
14
+ $html = file_get_contents('https://e.his-j.com/shop/tour/voyage.aspx?portal=02A&jarea=10&tour=TI-CYC0838');
15
+
14
16
  $dom = new DOMDocument;
17
+ @$dom->loadHTML(
15
- @$dom->loadHTMLFile('https://e.his-j.com/shop/tour/voyage.aspx?portal=02A&jarea=10&tour=TI-CYC0838');
18
+ mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII,JIS,UTF-8,eucJP-win,SJIS-win'), // 文字化け対応
19
+ LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
20
+ );
16
21
  $xpath = new DOMXPath($dom);
17
22
  $price = $xpath->evaluate('string(//*[@class="price01"])');
18
23
 
@@ -30,4 +35,27 @@
30
35
  // int(259800)
31
36
  ```
32
37
 
33
- でどうぞ。
38
+ でどうぞ。
39
+
40
+ # (追記) 正規表現で対応する場合
41
+
42
+ ```php
43
+ <?php
44
+
45
+ $html = file_get_contents('https://e.his-j.com/shop/tour/voyage.aspx?portal=02A&jarea=10&tour=TI-CYC0838');
46
+
47
+ // 文字化け対応とテキスト部分のみの抽出
48
+ $dom = new DOMDocument;
49
+ @$dom->loadHTML(
50
+ mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII,JIS,UTF-8,eucJP-win,SJIS-win'),
51
+ LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
52
+ );
53
+ $text = $dom->documentElement->nodeValue;
54
+
55
+ if (preg_match('/([\d,]+)\s*円\s*~\s*([\d,]+)\s*円/', $text, $match)) {
56
+ list(, $min, $max) = array_map('intval', str_replace(',', '', $match));
57
+ var_dump($min, $max);
58
+ // int(209800)
59
+ // int(259800)
60
+ }
61
+ ```

3

修正

2018/06/09 08:01

投稿

mpyw
mpyw

スコア5223

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

2

修正

2018/06/09 06:22

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -18,6 +18,10 @@
18
18
 
19
19
  ```php
20
20
  list($min, $max) = array_map('intval', explode('〜', str_replace(',', '', $price)));
21
+
22
+ var_dump($min, $max);
23
+ // int(209800)
24
+ // int(259800)
21
25
  ```
22
26
 
23
27
  でどうぞ。

1

intで取得

2018/06/09 06:14

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -14,4 +14,10 @@
14
14
  // string(23) "209,800円〜259,800円"
15
15
  ```
16
16
 
17
- これだけ。サードパーティライブラリは一切不要です。
17
+ これだけ。サードパーティライブラリは一切不要です。もし価格レンジを数値で取得したいのであれば更に
18
+
19
+ ```php
20
+ list($min, $max) = array_map('intval', explode('〜', str_replace(',', '', $price)));
21
+ ```
22
+
23
+ でどうぞ。