質問

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は正常に動作しますが、.ventdateは何も返さない。したがって、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を超えて、.opponent、hrefも欲しいです。 a 対戦相手と a アンカーテキスト。

役に立ちましたか?

解決

私は自分でQueryPathを学んでいるだけですが、行オブジェクトを分岐する必要があると思います。それ以外の場合 $tr->find('.eventdate') あなたをに連れて行きます abbr 行に含まれる要素、およびそれぞれのフォロー find() 下に要素を見つけようとします abbr, 、一致しない。 branch() (見る ドキュメンテーション)QueryPathオブジェクトのコピーを作成し、元のオブジェクトを残します(この場合は $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>';
}

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

他のヒント

QueryPathは、パフォーマンス上の理由で(jQueryとは異なり)国家を内部的に維持しています。そう branch() 行く方法です。

ただし、提案されたソリューションの変更として、これを行うことにより、発見()呼び出しの数を最小限に抑えることをお勧めします。

$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 Wayを使用するという考えをいじっています。残念ながら、この方法はより多くのメモリを使用するので、私はそれを保持しないかもしれません。その間 branch() 学ぶのに少し時間がかかります、それはその利点があります。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top