2

OK、これは私を夢中にさせています。phpQuery を使用して、次の一見些細な HTML をスクリーン スクレイピングしようとしています。

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

日付はnobrタグでラップされているので簡単です。$element[':first-child']->text()トリックを行います。 しかし、テキストの 2 番目のビットで汚れたミットを取得するにはどうすればよいでしょうか?

CSS は要素に対してのみ機能するため、テキストではなくnth-child(2),(3)周囲の<br>タグを返します。

XPath を実行できれば、2 番目のノードは.//text()ゴールドになります。しかし、どうやら phpQuery ランドでは、コンテキスト$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 に答える