我试图抓取网页内容,使用file_get_contents
抓取HTML然后使用DOMDocument
对象。我的问题是我无法获得适当的信息。我不确定这是因为我使用DOMDocument
的方法是错误的,还是我的源中的(X)HTML很差。
在源代码中,有一个ID为' cards'的元素,它有两个子div
s。我想要第一个孩子,其中有许多孩子div
,而这个孩子又有一个anchor
孩子,div
孩子。我想要href
中的anchor
和来自其div
的nodeValue。
结构是这样的:
<div id="cards">
<div class="grid">
<div class="card-wrap">
<a href="linkValue">
<img src="..."/>
<div>nameValue</div>
</a>
</div>
...
</div>
<div id="...">
</div>
</div>
我是从$cards = $dom->getElementById("cards")
开始的。我得到一个DOMText对象,一个DOMElement对象,一个DOMText对象,一个DOMElement对象和一个DOMText对象。然后我使用$grid = $cards->childNodes->item(1)
来获取第一个DOMElement对象,它可能是.grid
元素。但是,当我然后使用:
foreach($grid->childNodes as $item){
if($item->nodeName == "div"){
echo $item->nodeName,' | ',$item->nodeValue,'<br>';
}
}
我最终得到一个充满&#34; div |的页面nameValue&#34;其中nameValue是嵌入式div nodeValue
,我无法找到anchor
来获取href
值。
我的DOMDocument做了一些明显错误的事情,或者这里还有更多的事情发生?
答案 0 :(得分:3)
好吧,从您的示例代码if($item->nodeName == "div"){
开始,我们将排除任何<a>
标记。另外,我不相信childNodes
允许递归迭代。
因此,要访问相关节点,您可以使用:
$children = $dom->getElementById("cards")->childNodes
->item(1)->childNodes->item(1)->childNodes;
然而,你可以看到这非常混乱......介绍XPath:
答案 1 :(得分:0)
XPath方式:
$src = <<<EOS
<div id="cards">
<div class="grid">
<div class="card-wrap">
<a href="linkValue">
<img src="..."/>
<div>nameValue</div>
</a>
</div>
</div>
<div id="whatever">
</div>
</div>
EOS;
$xml = new SimpleXMLElement($src);
list ($anchor) = $xml->xpath('//div[@id="cards"]/div[1]/div[1]/a');
echo $anchor->div, ' => ', $anchor['href'], PHP_EOL;
“获取div的第一个孩子div的第一个孩子div的锚,其中id为'cards'”
输出:
nameValue => linkValue