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

回答編集履歴

2

a

2016/06/11 11:40

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -22,16 +22,66 @@
22
22
  $dom = new DOMDocument;
23
23
  @$dom->loadHTMLFile("ここにURL?y={$year}");
24
24
  $xpath = new DOMXPath($dom);
25
- $texts = [];
25
+ $json = [];
26
- foreach ($xpath->query('//*[@id="expert"]//*[@class="inner"][1]//table//td') as $td) {
26
+ foreach ($xpath->query('//*[@id="expert"]//*[@class="inner"][1]//table//td') as $i => $td) {
27
- $texts[] = $td->nodeValue;
27
+ $json[$i]['date'] = $td->nodeValue;
28
28
  }
29
29
  header('Content-Type: application/json; charset=UTF-8');
30
- echo json_encode($texts, JSON_UNESCAPED_UNICODE);
30
+ echo json_encode($json, JSON_UNESCAPED_UNICODE);
31
31
  ```
32
32
 
33
33
  ```html
34
+ <!DOCTYPE html>
35
+ <meta charset="utf-8">
36
+ <title>Example</title>
37
+ <style>
38
+ [v-cloak] {
39
+ visibility: hidden;
40
+ }
41
+ </style>
42
+
43
+ 記事検索(キーワード指定):
44
+ <input type="text" v-model="year"><br>
45
+ <input type="button" value="データ取得" @click="fetchData">
46
+
47
+ <hr>
48
+
49
+ <div id="output" v-cloak>
50
+ <virtual v-for="item in list">
51
+ <div v-if="item.url"><a href="{{item.url}}">{{item.date}}</a></div>
52
+ <div v-else>{{item.date}}</div>
53
+ </virtual>
54
+ </div>
55
+
56
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.20/vue.min.js"></script>
57
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/vue-resource/0.7.2/vue-resource.min.js"></script>
58
+ <script>
59
+ 'use strict';
60
+
61
+ Vue.http.options.emulateJSON = true;
62
+
63
+ new Vue({
64
+ el: '#output',
34
- 現在編集中…
65
+ data: {
66
+ list: [],
67
+ },
68
+ methods: {
69
+ fetchData: function () {
70
+ this.list = [];
71
+ this.$http.get('aaa.php', {
72
+ year: year,
73
+ }).then(function (response) {
74
+ this.list = response.data;
75
+ }, function (response) {
76
+ this.list = [];
77
+ console.error(response.data);
78
+ });
79
+ },
80
+ }
81
+ });
82
+ </script>
35
83
  ```
36
84
 
85
+ (jQueryでやるのすごくダルそうだったのでVue.js使いました)
86
+
37
87
  サイトの具体的なURLも提示されていないので動作確認できてませんが,大まかな流れはこんな感じでいいかと思います.

1

a

2016/06/11 11:40

投稿

mpyw
mpyw

スコア5223

answer CHANGED
@@ -1,3 +1,16 @@
1
+ ```php
2
+ $d = $item->find("innertext");
3
+ $tmp = array();
4
+ if(is_array($d)) $tmp["date"] = $d[0]->innertext;
5
+ $ts->add($tmp);
6
+ ```
7
+
8
+ この辺全体的におかしいですね… これだと`<innertext>`というHTMLタグをfindしてきていることになっちゃうのでは…
9
+
10
+ ------
11
+
12
+ 【蛇足】
13
+
1
14
  Simple HTML DOM Parser は古いライブラリで非常に動作が遅いです.せっかくなので**速い上に外部ライブラリが不必要**な方法で回答してみます.
2
15
 
3
16
  - [PHPネイティブのDOMによるスクレイピング入門](http://qiita.com/mpyw/items/c0312271819baee09132)