0

Symfony 2.8 と DomCrawler を使用して Web サイトを解析していdataますが、HTML エンティティからの属性の読み取りに問題があります。属性の特定の規則と同じくらい単純かもしれませんが、dataDomCrawler を介してデータ属性を取得する方法について説明している参考文献や例をウェブ上で見つけることができませんでした。

詳細は次のとおりです。

解析中の HTML でこの構造のインスタンスに遭遇しました (別の Web サイトから取得したため、この 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、値を返し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 docs から、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からのものです。私の経験では、クローラーは複雑な xpath 式に満足できず、その結果、DomCrawler から xpath / dom を直接使用するように切り替えました。

ベースxpathクエリは次のようになります//div/@data-src

于 2016-02-26T03:32:55.470 に答える