编程语言
首页 > 编程语言> > php-使用DOMDocument的Web刮板

php-使用DOMDocument的Web刮板

作者:互联网

我试图使用file_get_contents抓取HTML,然后使用DOMDocument对象来抓取网页内容.我的问题是我无法获得适当的信息.我不确定这是因为我使用DOMDocument的方法错误,还是源中的(X)HTML不好.

在源代码中,有一个ID为’cards’的元素,其中有两个子div.我想要第一个孩子,该孩子有很多孩子div,而孩子又有一个固定孩子和div孩子.我想要来自锚点的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,但是我无法找到锚来获取其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

标签:domdocument,php
来源: https://codeday.me/bug/20191120/2044631.html