【问题标题】:DomXPath with DOMDocument to get <img> Class URLDomXPath 与 DOMDocument 获取 <img> 类 URL
【发布时间】:2013-04-09 21:49:33
【问题描述】:

我正在编写一个小爬虫脚本,它将找到具有特定类名的图像 URL。我知道我的 cURL 和 DOMDocument 运行正常,甚至是 DomXPath 真的(据我所知,没有错误)但我正在努力弄清楚如何获取 xpath 查询结果的 URL。

到目前为止我的代码:

$dom = new DOMDocument();
@$dom->loadHTML($x);

$xpath = new DomXpath($dom);
$div = $xpath->query('//*[@class="productImage"]');


var_dump($div);
echo $div->item(0);

如果我 var_dump($x) 页面输出没有问题。所以 CURL 工作正常。但我不知道如何获取 $div 中包含的数据。我正在尝试查找具有“productImage”类的图像,如下所示:

<img src="/uploads/5W/yP/5WyPP4l7Z-jmZRzu_MJ6zg/1077-d.jpg" border="1" alt="Album" class="productImage">

我想要那个图片标签的来源。

有什么建议吗?

【问题讨论】:

    标签: php domdocument domxpath


    【解决方案1】:
    $dom = new DOMDocument();
    $dom->loadHTML($x);
    
    $xpath = new DomXpath($dom);
    $imgs  = $xpath->query('//*[@class="productImage"]');
    
    foreach($imgs as $img)
    {
        echo 'ImgSrc: ' . $img->getAttribute('src') .'<br />' . PHP_EOL;
    }
    

    试试看……

    == 编辑:附加信息 ==

    我在这里使用循环的原因是因为你可能会发现不止一个 img。如果您知道只有一个元素(或者您希望找到第一个 dom 节点),您可以通过 domnodelist 的 item 方法从 domnodelist 访问 elelement - 如下所示:

    $dom = new DOMDocument();
    $dom->loadHTML($x);
    
    $xpath = new DomXpath($dom);
    $img   = $xpath->query('//*[@class="productImage"]');
    
    echo 'ImgSrc: ' . $img->item(0)->getAttribute('src') .'<br />' . PHP_EOL;
    

    【讨论】:

    • 天哪,谢谢。是否有一个列表列出了 xpath 查询结果的所有对象函数?因为我找不到它:S
    • 如果您浏览文档 (php.net/manual/en/book.dom.php),您将看到 xpath 查询返回一个 DomNodeList。然后,您可以阅读 DomNodeList 具有哪些属性和方法(每个属性和方法只有 1 个)。当您可以访问每个节点时,您可以阅读 DomElement obj 以及如何访问所有魔法。
    • 如果只期望单个节点匹配,可以在Xpath中强制转换,直接获取标量值:$img = $xpath-&gt;evaluate('string(//*[@class="productImage"]/@src)');
    【解决方案2】:

    您实际上不需要在这里使用 XPath,因为您似乎只是在寻找图像,这可以通过使用 DOMDocument::getElementsByTagName() 来完成,然后是一个简单的过滤器:

    foreach ($dom->getElementsByTagName('img') as $image) {
        $class = $image->getAttribute('class');
        if (strpos(" $class ", " productImage ") !== false) {
            $url = $image->getAttribute('src');
            // do stuff
        }
    }
    

    然后,您可以使用DOMElement::getAttribute() 获取src 属性:

    echo $image->getAttribute('src');
    

    【讨论】:

    • strpos(" $class ", " productImage ") 无法匹配 OP 的样本。
    • @ChrisJJ 你是什么意思?
    • 对不起,我的错误。请忽略。
    • 我不明白这个答案的问题,谁能赐教?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多