我正在尝试使用以下方法抓取网页内容file_get_contents
抓取 HTML,然后使用DOMDocument
目的。我的问题是我无法获得适当的信息。我不确定这是否是因为我正在使用DOMDocument
的方法错误,或者我的源代码中的 (X)HTML 很差。
在源代码中,有一个 id 为“cards”的元素,它有两个子元素div
s。我想要第一个孩子,它有很多孩子div
s,而他们又拥有anchor
孩子与div
孩子。我想要href
来自anchor
以及它的子节点的 nodeValuediv
.
结构是这样的:
<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 是嵌入的 divnodeValue
,并且我无法找到anchor
s 得到他们的href
value.
我是否对 DOMDocument 做了一些明显错误的事情,或者可能还有更多问题发生?
好吧,从你的示例代码来看if($item->nodeName == "div"){
非常会排除任何<a>
标签。另外,我不相信childNodes
允许递归迭代。
因此,要访问有问题的节点,您could use:
$children = $dom->getElementById("cards")->childNodes
->item(1)->childNodes->item(1)->childNodes;
然而,正如您所看到的,这非常混乱......介绍 XPath:
- http://php.net/manual/en/class.domxpath.php http://php.net/manual/en/class.domxpath.php
- http://www.w3schools.com/xpath/xpath_syntax.asp http://www.w3schools.com/xpath/xpath_syntax.asp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)