Web scraper with DOMDocument


Web scraper with DOMDocument

我正在尝试抓取网页中的内容,使用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