我正在尝试抓取网页中的内容,使用file_get_contents
获取HTML,然后使用DOMDocument
对象。我的问题是我无法获得适当的信息。我不确定这是因为我用错了DOMDocument
的方法,还是源代码中的(X)HTML太差了。
在源中,有一个id为"cards"的元素,它有两个子div
s。我想要第一个子,它有许多子div
s,而这些子又有一个anchor
子和div
子。我想要anchor
中的href
和它的子级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
元素。然而,当我用遍历$grid时
foreach($grid->childNodes as $item){
if($item->nodeName == "div"){
echo $item->nodeName,' | ',$item->nodeValue,'<br>';
}
}
最后,我看到了一个充满"div|nameValue"的页面,其中nameValue是嵌入的div的nodeValue
,并且我无法找到anchor
来获取它们的href
值。
我的DOMDocument是否有明显的错误,或者可能还有其他事情发生?
从您的示例代码中,if($item->nodeName == "div"){
将排除任何<a>
标记。此外,我不认为childNodes
允许递归迭代。
因此,要访问有问题的节点,可以使用:
$children = $dom->getElementById("cards")->childNodes
->item(1)->childNodes->item(1)->childNodes;
然而,正如你所看到的,这是非常混乱的。。。XPath:简介
- http://php.net/manual/en/class.domxpath.php
- http://www.w3schools.com/xpath/xpath_syntax.asp
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;
"获取id为'cards'的div的第一个子div的第一个子div的锚点"
输出:
nameValue => linkValue