2

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

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

日期很简单,因为它包含在 nobr 标签中,例如。$element[':first-child']->text()成功了。 但是,如何在第二段文字上戴上脏兮兮的手套呢?

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

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

想法?如何使用 jQuery 选择文本节点中的所有解决方案?似乎涉及到 Javascript DOM 操作,这比 PHP 糟糕的 DOM API 要少得多。也许只是将整个元素转储到字符串并爆炸它<br>是要走的路......

4

3 回答 3

3

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

DOMNodeList DOMXPath::query ( string $expression [, DOMNode $contextnode [, boolean $registerNodeNS = true ]] )

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

$element->xpath->query('text()[1]',$element)
于 2010-11-09T12:28:38.987 回答
0

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

于 2010-11-09T12:51:36.660 回答
0

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

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);

耶!

于 2010-11-10T11:03:49.880 回答