2010-10-14 67 views
0

我试图使用xpath和domdocument在html页面中获取div的内容。这是页面的结构:PHP:使用xpath()获取html页面中的内容

<div id="content"> 
<div class="div1"></div> 
<span class="span1></span> 
<p></p> 
<p></p> 
<p></p> 
<p></p> 
<p></p> 
<div class="div2"></div> 
</div> 

我只想得到p的内容,而不是跨度和div。我通过这个xpath表达式.//*[@id='content']/p但是猜测某事不对,因为我只得到第一个p。尝试使用其他表达式与以下兄弟和节点(),但都只返回第一个p。

.//*[@id='content']/span/following-sibling::p 
.//*[@id='content']/node()[self::p] 

这是怎样的二手的XPath:

$domDocument=new DOMDocument(); 
$domDocument->encoding = 'UFT8'; 
$domDocument->loadHTML($page); 
$domXPath = new DOMXPath($domDocument); 
$domNodeList = $domXPath->query($this->xpath); 
$content = $this->GetHTMLFromDom($domNodeList); 

这也是我如何让HTML代码节点:

private function GetHTMLFromDom($domNodeList){ 
$domDocument = new DOMDocument(); 
$node = $domNodeList->item(0); 
foreach($node->childNodes as $childNode) 
$domDocument->appendChild($domDocument->importNode($childNode, true)); 
return $domDocument->saveHTML(); 
} 

回答

2

这个XPath表达式:

//div[@id='content']/p 

结果在想要的节点集(五个p元素)

编辑:现在很清楚你的问题。您需要遍历节点列表:

private function GetHTMLFromDom($domNodeList){ 
    $domDocument = new DOMDocument(); 
    foreach ($nodelist as $node) { 
     $domDocument->appendChild($domDocument->importNode($node, true)); 
    } 
    return $domDocument->saveHTML(); 
} 
+0

@Alejandro:谢谢你的答案,但// DIV [@ ID = '内容']/P 不要对我的作品,我只得到了firts页。 – Luciano 2010-10-14 18:49:13

+0

@Luciano:然后问题出在你的代码中的其他地方。尝试查询后:'echo $ domNodeList-> length' – 2010-10-14 19:15:13

+0

@Alejandro:节点数是正确的,但我仍然只得到第一个p。它可能是由tidy()函数给出的错误。我用curl得到了页面的内容,但后来我用$ tidy-> parseString($ curl_res)解析它; $ tidy-> cleanRepair(); return $ tidy; 最后我把这个值作为$ page发送给domdocument。 – Luciano 2010-10-15 11:24:42