【问题标题】:PHP How to merge 2 queriesPHP如何合并2个查询
【发布时间】:2012-12-10 22:02:01
【问题描述】:

我有这两个问题:


1) 获取所有图片的URL:

$imgs = $xpath->query('//div[@class="pin"]/div[@class="PinHolder"]/a/img');



2) 获取每张图片在 Facebook 上点赞的人数:

foreach($xpath->query('//span[@class="LikesCount"]') as $span) {
    $int = (int) $span->nodeValue;
    if ($int > 5) {
        echo $i++ . "--> " . $int . "<br />";
    }
}



我想合并它们以获得 Facebook 点赞超过 5 次的图片 也就是说,未被点赞的图片根本没有 LikesCount 类。

按照标记示例:

<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"> 
        22 likes 
    </span>
    <span class="RepinsCount">
        6 repins
    </span>
</p>

[...]

</div>

【问题讨论】:

  • 我已经为您正确格式化了问题。你为什么一直在还原它?
  • 对不起,第一天在这里..谢谢!
  • 请提供完整的输入XML(前提是XML不包含div[@class="PinHolder"]
  • 您将需要 XPath 2.0,但像 //div[@class="pin"]/p/span[@class="LikesCount"][substring-before(., " ") &gt; 5]/ancestor::div[@class="pin"]/a/img 这样的东西应该可以作为开始。
  • @Geo:再说一次,你为什么要恢复我的格式?我不喜欢重复自己!

标签: php xml dom xpath xpath-2.0


【解决方案1】:

要检索不是所有图像,而是仅检索点赞数为 5 或更多的图像,我会尝试将分配中的 XPath 表达式更改为 $imgs 以读取:

//div[@class="pin"]
     [.//span[@class = 'LikesCount']
             [substring-before(normalize-space(.),' ') > 5]]
     /div[@class="PinHolder"]
     /a/img

(我添加了空格以使其更易于理解;如果您的 XPath 解析器在这件事上不遵循规范 [有些不遵循],您可能需要删除换行符)。

我不清楚为什么 cbuckley 说这需要 XPath 2.0;也许他在这里看到了一些我没有看到的微妙问题。

【讨论】:

  • 谢谢 McQueer,但我仍然不明白如何打印/处理 xpath 的输出。它是数组、单个字符串还是 DOM 元素?我到底吓坏了什么:D和这个查询--> //span[@class="LikesCount"][normalize-space(.)]
  • 从 XPath 的角度来看,我给出的 XPath 表达式计算为 XML 文档中的一组节点。给定的编程语言和库对它们使用什么表示取决于它们,而不是 XPath。 PHP documentation 表示 DOMXPath::query 返回一个 DOMNodelist 类型的值;如果您知道如何处理现有查询的结果,那么您应该知道如何处理重新制定的查询的结果。 (如果没有,您似乎对 PHP 的 DOM 库有疑问,而不是关于 XPath。)
  • 表达式 //span[@class='LikesCount'] 匹配每个带有 class 属性的 span 元素,其值为“LikesCount”。添加谓词[normalize-space(.)] 进一步将结果限制为表达式normalize-space(.) 计算结果为真的span 元素。因此,谓词具有过滤掉任何为空或仅包含空格的span 元素的效果。注: normalize-space(.) 返回的值用于评估谓词,然后丢弃:它不会对返回的 DOM 节点产生任何影响。
  • 丢弃???这就是为什么我吓坏了,我没有明白这一点!因此,如果我想评估“标准化”值,我必须 1)在 xpath 查询中评估它或 2)在 php 中评估它,再次手动剥离空格!谢谢麦昆
  • 当然可以编写一个计算为规范化值的 XPath 表达式(并因此将规范化值返回给调用者),但不能将其包装在谓词中。如果这感觉很棘手,您可能会受益于对 XPath 的良好介绍。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多