0

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

以下是详细信息:

我在我正在解析的 HTML 中遇到了这个构造的一个实例(来自另一个网站,所以我不能修改这个 HTML):

  <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>

我正在使用此代码搜索div's 块并返回data-src值:

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 );
}

从 DomCrawler 文档中,我希望该attr函数返回data-src属性值,但它返回 null;我的函数的返回是一个由 6 个元素组成的数组,只有数字而不是附加文本。

在此先感谢您的帮助。

4

1 回答 1

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

于 2016-02-26T03:32:55.470 回答