2013-05-27 30 views
0

我嘗試了各種各樣的東西,但找不到解決方案。 我想在php中使用xpath從html代碼中檢索元素。如何使用xpath [PHP]批量解析HTML?

例:

<div class='student'> 
<div class='name'>Michael</div> 
<div class='age'>26</div> 
</div> 
<div class='student'> 
<div class='name'>Joseph</div> 
<div class='age'>27</div> 
</div> 

我想要檢索的信息,並把它們放在一個數組如下:

$student[0][name] = Michael; 
$student[0][age] = 26; 
$student[1][name] = Joseph; 
$student[1][age] = 27;` 

在我想匹配的青睞留在名稱等字樣。

我試過如下:

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$xpathDom = new DomXPath($dom); 
$homepostcontentNodes = $xpathDom->query("//*[contains(@class, 'student')]//*[contains(@class, 'name')]");` 

然而,這僅僅是抓住了我的節點的名字' 我怎樣才能獲得匹配的年齡節點?

回答

2

當然,它只是抓住節點name - 你告訴它!

什麼,你需要做的是在兩個步驟:

  1. 挑選出所有的學生節點
  2. 爲每個學生節點,挑選出列

這是一個非常標準數據線性化的步驟,並且XPath查詢很簡單:

步驟1

你幾乎有它:

$studentNodes = $xpathDom->query("//div[contains(@class, 'student')]"); 

這將返回所有student節點。

第2步

這就是魔術發生的地方。我們有我們的節點,我們可以通過它們循環(DOMNodeList implements Iterator,所以我們可以通過它們回到foreach)。我們需要弄清楚的是如何找到它的孩子們......

......等等。 DOMNode實現了一種稱爲getNodePath的方法,該方法將完整的直接XPath路徑返回給該節點。這使我們可以簡單地追加/div以獲得節點的所有div直接後代!

另一種快速的foreach,我們得到這個代碼:

$studentNodes = $xpathDom->query("//div[contains(@class, 'student')]"); 
$result = array(); 
foreach ($studentNodes as $v) { 
// Child nodes: student 
$r = array(); 
$columns = $xpathDom->query($v->getNodePath()."/div"); 
foreach ($columns as $v2) { 
      // Attributes allows me to get the 'class' property of the node. Bit clunky, but there's no alternative 
    $r[$v2->attributes->getNamedItem("class")->textContent] = $v2->textContent; 
} 
$result[] = $r; 
} 
var_dump($result); 

完全小提琴:http://codepad.viper-7.com/t868Wh

+0

吧!我試圖通過學生循環,你只是給了我正在尋找的答案。非常感謝! –

+0

@ShiggySteez:沒問題。如果這是您正在尋找的內容,請隨時接受它作爲最佳答案。 –

+0

嘿嘿,我正在尋找那個按鈕:P歡呼! –