PHP:使用xpath()从html页面获取内容

时间:2010-10-14 18:12:42

标签: php xpath domdocument

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

<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的内容,而不是spans和div。我是通过这个xpath表达式 .//* [@ id ='content'] / p 来的,但是我觉得有些事情不对,因为我只得到第一个p。尝试使用带有follow-sibling和node()的其他表达式,但都只返回第一个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();
}

1 个答案:

答案 0 :(得分:2)

这个XPath表达式:

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

导致所需节点集(五个p元素)

编辑:现在很清楚你的问题是什么。您需要迭代NodeList:

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