【问题标题】:Selecting a specific text node with phpQuery使用 phpQuery 选择特定的文本节点
【发布时间】:2011-05-07 05:02:14
【问题描述】:

好吧,这让我发疯了。我正在尝试使用 phpQuery 对以下看似微不足道的 HTML 进行屏幕抓取:

<td><nobr>10-05-2009</nobr><br>06:10<br>17:35 -1</td>

日期很简单,因为它包含在 nobr 标记中,例如。 $element[':first-child']-&gt;text() 可以解决问题。 但是如何让我的脏手套戴在第二段文字上?

CSS 仅适用于元素,因此 nth-child(2),(3) 返回周围的 &lt;br&gt; 标签,而不是文本。

如果我可以 XPath 它,.//text() 中的第二个节点将是黄金。但显然在 phpQuery-land 中,$element-&gt;xpath-&gt;query('.//text()') 的上下文是文档根,所以我得到了整个文档中的每一段文本!

想法? How do I select text nodes with jQuery? 中的所有解决方案似乎都涉及到 Javascript DOM 操作,这比 PHP 糟糕的 DOM API 要少得多。也许只是将整个元素转储到字符串并在&lt;br&gt; 上爆炸是要走的路...

【问题讨论】:

    标签: jquery css-selectors xpath textnode phpquery


    【解决方案1】:

    来自http://php.net/manual/en/domxpath.query.php

    DOMNodeList DOMXPath::query ( 字符串 $表达式 [, DOMNode $contextnode [, boolean $registerNodeNS = true ]] )

    因此,这应该与 td 作为上下文节点一起使用:

    $element->xpath->query('text()[1]',$element)
    

    【讨论】:

    • 谢谢,这基本上可以,但是您需要传入一个 DOMNode(而不是 phpQueryObject)然后转换回结果,并且由于我不太了解 XPath 选择器.//text()[1] 的原因不起作用,但xpath-&gt;query('.//text()')-&gt;item(1) 起作用。所以最终的代码是这样结束的:$src_time = pq($element)-&gt;xpath-&gt;query('.//text()', $element)-&gt;item(1); $src_time = pq($src_time)-&gt;text(); 非常可怕,但是可以完成工作,非常感谢!
    【解决方案2】:

    您是否尝试过遍历$element[':first-child']-&gt;siblings() 的文本方法?那应该可以让你访问他们所有的文本,不是吗?

    【讨论】:

    • 不怕——兄弟姐妹只返回两个
      标签。
    • 哦!好的。抱歉,我误读了 br(我认为一个是开放标签,另一个是结束标签,出于某种原因)
    【解决方案3】:

    以亚历杭德罗的回答为基础,我想出了这个小功能:

    function nth_text($element, $n) {
      $xpath = new DOMXPath($element->ownerDocument);
      return $xpath->query('.//text()', $element)->item($n)->textContent;
    }
    

    顺便说一句,这是纯 PHP DOM,不需要 phpQuery(或允许,参数必须是 DOMNode 或 DOMElement)。现在原来的问题很简单:

    $src_date = nth_text($element, 0);
    $src_time = nth_text($element, 1);
    

    耶!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 2021-02-23
      • 1970-01-01
      相关资源
      最近更新 更多