我正在尝试使用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();
}
答案 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();
}