18

次の HTML (同じ構造) と次のコードで PHP の DOM 要素を使用して、 class = 'review-text' のdiv からテキストを取得しようとしています。

ただし、これは機能しないようです

  1. HTML

    $html = '
        <div class="page-wrapper">
            <section class="page single-review" itemtype="http://schema.org/Review" itemscope="" itemprop="review">
                <article class="review clearfix">
                    <div class="review-content">
                        <div class="review-text" itemprop="reviewBody">
                        Outstanding ... 
                        </div>
                    </div>
                </article>
            </section>
        </div>
    ';
    
  2. PHPコード

        $classname = 'review-text';
        $dom = new DOMDocument;
        $dom->loadHTML($html);
        $xpath     = new DOMXPath($dom);
        $results = $xpath->query("//*[@class and contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
    
        if ($results->length > 0) {
            echo $review = $results->item(0)->nodeValue;
        }
    

クラスごとに要素を選択するための XPATH 構文は、このブログで提供されています。

私は StackOverflow のオンライン チュートリアルから多くの例を試しましたが、どれもうまくいかないようです。何か不足していますか?

4

2 に答える 2

31

次の XPath クエリは、必要なことを行います。$xpath->query に指定された引数を次のように置き換えるだけです。

//div[@class="review-text"]

編集: 開発を容易にするために、http://www.xpathtester.com/test で独自の XPath クエリをオンラインでテストできます

Edit2: このコードをテストしました。それは完全に機能しました。

<?php

$html = '
    <div class="page-wrapper">
        <section class="page single-review" itemtype="http://schema.org/Review" itemscope="" itemprop="review">
            <article class="review clearfix">
                <div class="review-content">
                    <div class="review-text" itemprop="reviewBody">
                    Outstanding ... 
                    </div>
                </div>
            </article>
        </section>
    </div>
';

$classname = 'review-text';
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$results = $xpath->query("//*[@class='" . $classname . "']");

if ($results->length > 0) {
    echo $review = $results->item(0)->nodeValue;
}

?>
于 2013-08-12T08:52:21.057 に答える
5

Frak Houweling の回答を拡張すると、 DomXpath を使用して特定の DomNode 内を検索することもできます。これは、 をメソッドcontextNodeの 2 番目の引数として渡すことで実現できます。DomXpath->query

$dom = new DOMDocument;
$dom->loadHTML ($html);
$xpath = new DOMXPath ($dom);

foreach ($xpath->query ("//section[@class='page single-review']") as $section)
{
    // search for sub nodes inside each element
    foreach ($xpath->query (".//div[@class='review-text']", $section) as $review)
    {
        echo $review->nodeValue;
    }
}

ノード内を検索する場合.は、式の先頭にドットを追加して相対パスを使用する必要があることに注意してください。

"//div[@class='review-text']" // absolute path, search starts from the root element
".//div[@class='review-text']" // relative path, search starts from the provided contextNode
于 2016-04-19T22:44:31.190 に答える