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"]), " ")

在执行大于运算符之前,XPath 处理器将类似计数字符串转换为双精度。(您可以通过number()强制进行此转换,但在这种情况下是不必要的,并且可能会因为自动转换失败的相同原因而失败 - 前导空格。)

于 2012-12-10T18:53:20.970 回答