Domanda

Sto usando QueryPath e PHP.

Questo trova il .EventDate Okay, ma non restituisce nulla per .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>';
}

Se scambio i due, .dtstart funziona bene, ma .eventdate non restituisce nulla. Pertanto, sembra che Find () in QueryPath distrugga l'elemento e restituisca solo il valore di cui ha bisogno, rendendo l'iterazione oltre $ TR non è possibile cercare più articoli.

Ecco Esempio HTML per un TR che ho a che fare con:

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

Ho provato a copiare il $ TR prima della prima scoperta e sostituirlo prima del secondo, ma non ha funzionato.

Come posso cercare durante ogni $ TR per determinate variabili?

Fyi, oltre .eventdate e .dtstart, voglio anche il .opponent, href sotto il a per l'avversario e il a testo di ancoraggio.

È stato utile?

Soluzione

Sto solo imparando querypath da solo, ma penso che dovresti ramificare l'oggetto riga. Altrimenti il $tr->find('.eventdate') ti porterà al abbr elemento contenuto nella riga e ogni seguito find() cercherò di trovare elementi sotto il abbr, con conseguente corrispondenza. branch() (vedere documentazione) crea una copia dell'oggetto querypath, lasciando l'oggetto originale (in questo caso $tr) intatto.

Quindi il tuo codice sarebbe:

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

Non so se questo è il modo preferito per ottenere ciò che vuoi, ma sembra funzionare.

Altri suggerimenti

QueryPath mantiene il suo stato internamente (a differenza di JQuery) per motivi di prestazione. Così branch() è la strada da percorrere.

Come modifica alla soluzione proposta, tuttavia, suggerirei di ridurre al minimo il numero di chiamate () facendo questo:

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

Infine, ogni volta che fai un'azione "distruttiva" (come un find()), puoi sempre tornare indietro di un passo usando end(). Quindi quanto sopra potrebbe anche essere fatto in questo modo:

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

Questo è un miglioramento delle prestazioni molto molto minore, ma preferisco il branch() Metodo a meno che non lavoro con documenti più grandi di 1 m.

In QueryPath 3.x, che ha un sacco di nuovi miglioramenti delle prestazioni, sto giocando con l'idea di andare con il modo jQuery di creare un nuovo oggetto per ogni funzione. Sfortunatamente, questo metodo utilizzerà molta più memoria, quindi potrei non tenerlo. Mentre branch() Ci vuole un po 'di tempo per imparare, ha i suoi vantaggi.

Sì, hai ragione, in realtà ho avuto questo problema oggi, in jQuery, fai solo query, query, query, query senza problemi, per quanto querypath se si richiede, cambia lo "stato" interno dell'oggetto, quindi se si tenta una seconda domanda , viene applicato contro lo stato attuale.

Quindi, se si desidera interrogare più posizioni "separate" nel documento, devi ramificare prima

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

Sembra funzionare nel mio codice, quindi suppongo che funzionerà nel tuo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top