php - 在带有 QueryPath 的 foreach 中使用多个查找

标签 php querypath

我正在使用 QueryPath 和 PHP。

这发现 .eventdate 没问题,但没有为 .dtstart 返回任何内容:

$qp = htmlqp($url);
foreach ($qp->find('table#schedule')->find('tr') as $tr){
    echo 'date: ';
    echo $tr->find('.eventdate')->text();
    echo ' time: ';
    echo $tr->find('.dtstart')->text();
    echo '<br>';
}

如果我交换两者,.dtstart 工作正常,但 .eventdate 不返回任何内容。因此,似乎 querypath 中的 find() 破坏了元素并只返回它需要的值,使得 $tr 上的迭代不可能搜索多个项目。

这是我正在处理的 TR 的示例 HTML:

<tr class="event"><th class="date first" scope="row"><abbr class="eventdate" title="Thursday, February 01, 2011" >02/01</abbr><span class="eventtime" ><abbr class="dtstart" title="2012-02-01T19:00:00" >7:00 PM</abbr><abbr class="dtend" title="2012-02-01T21:00:00" >9:00 PM</abbr></span></th><td class="opponent summary"><ul><li class="first">@ <a class="team" href="/high-schools/ridge-wolves/basketball-winter-11-12/schedule.htm" >Ridge </a> <span class="game-note">*</span></li><li class="location" title="Details: Ridge High School">Details: Ridge High School</li><li class="last"><a class="" href="/local/stats/pregame.aspx?contestid=4255-4c6c-906d&amp;ssid=381d-49f5-9f6d" >Preview Game</a></li></ul></td><td class="result last"><a class="pregame" href="/local/stats/pregame.aspx?contestid=4255-4c6c-906d&amp;ssid=381d-49f5-9f6d">Preview</a></td></tr>

我尝试在第一次查找之前复制 $tr 并在第二次查找之前替换它,但这没有用。

如何在每个 $tr 期间搜索某些变量?

仅供引用,除了 .eventdate 和 .dtstart,我还想要 .opponent,a 下的对手 href 和 a anchor 文本。

最佳答案

出于性能原因,QueryPath 在内部维护其状态(与 jQuery 不同)。所以 branch() 是要走的路。

不过,作为对建议解决方案的修改,我建议通过执行以下操作最大限度地减少 find() 调用的次数:

$qp = htmlqp($url);
foreach ($qp->find('table#schedule tr') as $tr){
    echo 'date: ';
    echo $tr->branch('.eventdate')->text();
    echo ' time: ';
    echo $tr->branch('.dtstart')->text();
    echo '<br>';
}

最后,任何时候您执行“破坏性”操作(如 find()),您始终可以使用 end() 返回一个步骤。所以上面的也可以这样做:

$qp = htmlqp($url);
foreach ($qp->find('table#schedule tr') as $tr){
    echo 'date: ';
    echo $tr->find('.eventdate')->text();
    echo ' time: ';
    echo $tr->end()->find('.dtstart')->text();
    echo '<br>';
}

这是一个非常非常小的性能改进,但我更喜欢 branch() 方法,除非我处理的文档大于 1M。

在 QueryPath 3.x 中,它有一大堆新的性能增强,我正在考虑使用 jQuery 方法为每个函数创建一个新对象。不幸的是,这种方法会使用更多的内存,所以我可能不会保留它。虽然 branch() 需要一点时间来学习,但它确实有其优势。

关于php - 在带有 QueryPath 的 foreach 中使用多个查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8394657/

相关文章:

php - 如何获取Params类型的数组

php - Symfony2 测试 : filter with html:contains return one value

php - 使用 Symfony 将数据从一个表插入到另一个表

php - 动态更改 html 表格以在移动设备上显示

php - 可能的 PDOException 错误(MySQL 5)?

php - 将最新消息标记为... "new"

jquery - 选择最后一个直系子项

php - 查找并替换为 QueryPath

php - 结合 jQuery 和 Zen-Coding php 端口以在服务器端脚本上模拟客户端编程风格