2014-01-16 127 views
1

我在我的PHP腳本中使用PHP Simple HTML DOM Parser將信息從網站解析爲JSON對象。我的JSON對象最後應該像這樣格式化:在PHP中解析HTML並返回JSON

最多包含5個對象(星期一至星期五)或更少(星期二至星期五等)的數組。

所有這些對象都應該有兩個數組,一個叫做food1,另一個叫food 2。這兩個數組都應該包含多個食物名稱和價格。我認爲,在JSON它看起來是這樣的:

{ 
    "day" : [ 
    { 
     "food1" : [ 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     }, 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     } 
     ], 
     "food2" : [ 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     }, 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     } 
     ] 
    }, 
    { 
     "food1" : [ 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     }, 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     } 
     ], 
     "food2" : [ 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     }, 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     } 
     ] 
    }, 
    { 
     "food1" : [ 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     }, 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     } 
     ], 
     "food2" : [ 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     }, 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     } 
     ] 
    }, 
    { 
     "food1" : [ 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     }, 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     } 
     ], 
     "food2" : [ 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     }, 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     } 
     ] 
    }, 
    { 
     "food1" : [ 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     }, 
     { 
      "price" : "1.00", 
      "foodname" : "test" 
     } 
     ], 
     "food2" : [ 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     }, 
     { 
      "price" : "2.00", 
      "foodname" : "test2" 
     } 
     ] 
    } 
    ] 
} 

反正我以前只用Objective-C和有問題的工作與PHP解決這個問題。我也在Objective-C中實現了一個解析器,但如果網站更改了它們的結構,我將不得不重新提交整個應用程序等。這就是爲什麼我想要製作一個Web服務,以便我可以動態地將解析器更改爲應用程序。我得到的是這樣的:

<?php 
include('simple_html_dom.php'); 

$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); 
$context = stream_context_create($opts); 
$html = file_get_html('http://www.studentenwerk-karlsruhe.de/de/essen/?view=ok&STYLE=popup_plain&c=erzberger&p=1&kw=3',false,$context); 

foreach($html->find('b') as $e) 
    echo $e; 

?> 

這給了我所有的食物名稱,但它是沒有排序的天,也沒有對不同食物的菜單(也有每一天被稱爲food1兩個不同的菜單在我的示例JSON對象中爲food2)。

在我的Objective-C的解析器我剛剛創建了一個新的一天對象的時候,食品的名稱是「SchniPoSa」,並補充以下所有食品名稱food1,直到有自帶食物的名稱「Salatbuffet」這一點,下面所有的食物名稱我添加到food2數組中,直到出現下一個「SchniPoSa」食物名稱。但這不是很好,因爲結構可能每天都在變化。

此外,我甚至不知道如何在PHP中實現。在我的小PHP腳本中,我也不解析標籤<span class="bgp price_1">中的所有價格。

這裏是我想分析的信息的網站:

http://www.studentenwerk-karlsruhe.de/de/essen/?view=ok&STYLE=popup_plain&c=erzberger&p=1&kw=3

是否有任何人誰可以幫我像下面我描述了一個有效的JSON對象解析信息?

+0

如果網站改變了它的佈局,反正你將不得不改變你的代碼,也可以使用,當然這種方法.. –

+0

沒有「最終」版本,但我可以更改我的PHP web服務上的代碼。我不會(取決於變化)必須改變我的Objective-C代碼。因此,每次有一點變化時,我都不必提交應用更新。也可以這樣,我可以將Web服務公開給一些可能想訪問這些信息的人.. – dehlen

+0

這是真的,你可以有一個Web服務,只是標準化返回對象..將看着一個類,然後回來給你以後.. –

回答

4

剛剛看到你的消息,並意識到我還沒有回到你這裏。 也許這會導致你在正確的方向:

<?php 

$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); 
$context = stream_context_create($opts); 
$html = file_get_contents('http://www.studentenwerk-karlsruhe.de/de/essen/?view=ok&STYLE=popup_plain&c=erzberger&p=1&kw=3',false,$context); 

libxml_use_internal_errors(true); 
$dom = new DomDocument; 
$dom->loadHTML($html); 
$xpath = new DomXPath($dom); 
$nodes = $xpath->query("//table[@class='easy-tab-dot']"); 
//header("Content-type: text/plain"); 

foreach ($nodes as $i => $node) { 
    $arr = array(); 

    $children = $node->childNodes; 
    foreach ($children as $child) { 
     $tmp_doc = new DOMDocument(); 
     $tmp_doc->appendChild($tmp_doc->importNode($child,true));  
     #echo $tmp_doc->saveHTML(); 
     print_r($child); 
    } 
    echo "#######################################################################################"; 
} 
+1

感謝您的回答!所以基本上1個DomObject代表其中的一個表格。所以我已經有每天2菜單的細分。基本上我現在要做的就是在json對象中添加來自DomObjects的信息。謝謝 :) – dehlen