Symfony+;DOMClawler-如何从a<;中提取数据属性;部门>;

Symfony+;DOMClawler-如何从a<;中提取数据属性;部门>;,symfony,domcrawler,Symfony,Domcrawler,我正在使用symfony2.8&DomCrawler解析一个网站,从HTML实体中读取数据属性时遇到问题。这可能与数据属性的特定约定一样简单,但我在web上找不到任何讨论如何通过DomCrawler检索数据属性的参考或示例 详情如下: 我在正在解析的HTML中遇到了此构造的实例(来自另一个网站,因此我无法修改此HTML): 从DOMCawler文档中,我希望attr函数返回data src属性值,但它返回null;我的函数返回的是一个6个元素的数组,只有数字,没有额外的文本 提前感谢您的帮助。这

我正在使用symfony2.8&DomCrawler解析一个网站,从HTML实体中读取
数据
属性时遇到问题。这可能与
数据
属性的特定约定一样简单,但我在web上找不到任何讨论如何通过DomCrawler检索数据属性的参考或示例

详情如下:

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

从DOMCawler文档中,我希望
attr
函数返回
data src
属性值,但它返回null;我的函数返回的是一个6个元素的数组,只有数字,没有额外的文本


提前感谢您的帮助。

这可以使用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;
}
此函数来自。我的经验是,爬虫程序不喜欢复杂的xpath表达式,这导致从DOMClawler切换到直接使用xpath/dom


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

Hi Shaun-谢谢您这么做,但我无法替换Symfony中给定的。您建议的查询可以很好地工作(我对其进行了测试),但我简化了示例的要求,实际上,某些情况下div容器中可能有文本,我还需要访问和存储该文本以及属性值-Larry
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 );
}
/**
 * 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;
}