Symfony + DomCrawler - 如何从<div>中提取数据属性

时间:2016-02-25 07:33:43

标签: symfony domcrawler

我正在使用Symfony 2.8&amp; DomCrawler解析一个网站,我在从HTML实体中读取init()属性时遇到问题。它可能与data属性的特定约定一样简单,但我无法在Web上找到任何讨论如何通过DomCrawler检索数据属性的引用或示例。

以下是详细信息:

我在我正在解析的HTML中遇到过这个构造的实例(来自其他网站,因此我无法修改此HTML):

data

我使用此代码搜索 <div class='slideshowclass' id='slideshow'> <div data-thumb='http://www.example.com/thumbs/1.jpg' data-src='http://www.example.com/thumbs/1.jpg'></div> <div data-thumb='http://www.example.com/thumbs/2.jpg' data-src='http://www.example.com/thumbs/2.jpg'></div> <div data-thumb='http://www.example.com/thumbs/3.jpg' data-src='http://www.example.com/thumbs/3.jpg'></div> <div data-thumb='http://www.example.com/thumbs/4.jpg' data-src='http://www.example.com/thumbs/4.jpg'></div> <div data-thumb='http://www.example.com/thumbs/5.jpg' data-src='http://www.example.com/thumbs/5.jpg'></div> <div data-thumb='http://www.example.com/thumbs/6.jpg' data-src='http://www.example.com/6.jpg'></div> </div> &#39}的块并返回div值:

data-src

在DomCrawler文档中,我希望function getList( Crawler $pWebDoc ) { $list = $pWebDoc->filter( 'div#slideshow'); if ( !$list ) return null; $retlist = null; $x = $list->count(); if ( $x > 0 ) { /* @var $item Crawler */ $retlist = $list->children()->each( function (Crawler $item, $i ) { return ( "$i:" . $item->attr( 'data-src' )); }); } return ( $retlist ); } 函数返回attr属性值,但它返回null;从我的函数返回的是一个包含6个元素的数组,只有数字而不是附加文本。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

使用DOMDocument和XPath库可以轻松完成此操作。 XPath确实提供了返回数组值而不是节点的功能。

/**
 * Filters the list of nodes with an XPath expression.
 *
 * The XPath expression should already be processed to apply it in the context of each node.
 *
 * @param string $xpath
 *
 * @return Crawler
 */
private function filterRelativeXPath($xpath)
{
    $prefixes = $this->findNamespacePrefixes($xpath);
    $crawler = $this->createSubCrawler(null);
    foreach ($this->nodes as $node) {
        $domxpath = $this->createDOMXPath($node->ownerDocument, $prefixes);
        $crawler->add($domxpath->query($xpath, $node));
    }
    return $crawler;
}

此功能来自Crawler.php。我的经验是Crawler对复杂的xpath表达式不满意,导致从DomCrawler切换到直接使用xpath / dom。

您的基本xpath查询类似于//div/@data-src