3

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>';
}

2 つを交換すると、.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 をコピーして、2 番目の検索の前に置き換えようとしましたが、うまくいきませんでした。

各 $tr で特定の変数を検索するにはどうすればよいですか?

参考までに、.eventdate と .dtstart を超えてa、対戦相手とaアンカー テキストの下に .opponent、href も必要です。

4

3 に答える 3

9

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()) を実行するときはいつでも、 を使用して 1 ステップ戻ることができます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()習得には少し時間がかかりますが、利点があります。

于 2012-05-23T01:18:47.890 に答える
8

QueryPathは自分で勉強中なのですが、行オブジェクトを分岐させたほうがいいと思います。それ以外の場合、は行に含まれる要素に移動し、次の各$tr->find('.eventdate')要素は の下の要素を検索しようとするため、一致するものはありません。(ドキュメントを参照) QueryPath オブジェクトのコピーを作成し、元のオブジェクト (この場合は) をそのまま残します。abbrfind()abbrbranch()$tr

したがって、コードは次のようになります。

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

これがあなたが望むものを達成するための好ましい方法であるかどうかはわかりませんが、うまくいくようです。

于 2011-12-06T19:24:41.030 に答える
0

ええ、あなたは正しいです、私は実際に今日この問題を抱えていました、jqueryでは、クエリ、クエリ、クエリ、クエリは問題ありませんが、QueryPathをクエリすると、オブジェクトの内部「状態」が変更されるため、2番目のクエリを試みると、現在の状態に対して適用されます。

したがって、ドキュメント内の複数の「別々の」場所をクエリする場合は、前に分岐する必要があります

$ q = qp( "something.html);
$ a = $ q-> branch()-> find(" tr ");
$ b = $ q-> branch()-> find(" a ");

それは私のコードで機能するようですので、あなたのコードでも機能すると思います。

于 2012-04-09T13:44:30.823 に答える