1

これを書く:

$likes = $xpath->query('//span[@class="LikesCount"]');

これは私が得るものです:

155 like

number_before_like > 5 となるようにクエリを書きたいと思います

$likes = $xpath->query('

((int)substring-before(//span[@class="LikesCount"], " ")) > 5


');

マークアップに従います。

<div class="pin">

[...]

<a href="/pin/56787645270909880/" class="PinImage ImgLink">
    <img src="http://media-cache-ec3.pinterest.com/upload/56787645270909880_d7AaHYHA_b.jpg" alt="Krizia" data-componenttype="MODAL_PIN" class="PinImageImg" style="height: 288px;">
</a>

<p class="stats colorless">
    <span class="LikesCount"> 
        2 likes 
    </span>
    <span class="RepinsCount">
        6 repins
    </span>
</p>

[...]

</div>
4

2 に答える 2

2

これは、XPath構文だけで、余分な空白が画像から削除されていることを確認することで実行できます。

$query = 'number(substring-before(normalize-space(
          //span[@class="LikesCount" 
          and substring-before(normalize-space(.), " ") > 5]), " "))';

$likes = $xpath->evaluate($query);

または、PHPにハードワークを任せてください。

$query = 'number(php:functionString("intval",
          //span[@class="LikesCount"
          and php:functionString("intval", .) > 5]))';

$xpath->registerNamespace('php', 'http://php.net/xpath');
$xpath->registerPHPFunctions("intval");
$likes = $xpath->evaluate($query);

PHPに作業の一部を実行するように依頼する場合は、単純なクエリを使用して、必要に応じて結果をフィルタリングする方が簡単な場合があります。

foreach ($xpath->query('//span[@class="LikesCount"]') as $span) {
    $int = (int) $span->nodeValue;
    if ($int > 5) {
        echo $int;
    }
}
于 2012-12-10T19:10:42.510 に答える
1

あなたの問題は、実際には選択したの余分なスペースだと思います<span>。それらを取り除いてみてください。たとえば、次のように使用できますnormalize-space()

substring-before(normalize-space(//span[@class="LikesCount"]), " ")

like カウント文字列は、大なり演算子の実行前に XPath プロセッサによってdouble に変換されます。( number()を介してこの変換を強制できますが、この場合は不要であり、自動変換が失敗したのと同じ理由で失敗する可能性があります-先頭の空白。)

于 2012-12-10T18:53:20.970 に答える