C # HtmlAgilityPack aggiunta tbody

c# html html-agility-pack xpath

Domanda

Il C # HtmlAgilityPack, aggiunge l'elemento tbody dopo la funzione LoadHtml, nell'albero DOM nelle tabelle anche se non esiste nel documento HTML originale. Come posso disabilitare questo?

Il mio algoritmo crea alcune espressioni XPATH, attraversando il dom tree e quell'elemento tbody non esistente all'interno del documento originale rende il SelectNodes non trova gli elementi desiderati. Mi ci è voluto un sacco di tempo per capirlo: |

È possibile rendere SelectNodes anche considerare nodi aggiunti da HtmlAgilityPack?

Esempio:

<table>
    <tr><td>data</td></tr>
</table>

La mia applicazione produrrebbe questo XPATH per estrarre i "dati": // table / tbody / tr / td

Il tag tbody in expression è stato aggiunto perché è presente nella struttura DOM dopo l'analisi del codice html da HtmlAgilityPack perché HtmlAgilityPack l'ha aggiunto anche se non esiste. Per questo motivo

doc.DocumentNode.SelectNodes("//table/tbody/tr/td");

fallirebbe.

In altre parole, l'elemento tr (HtmlElement) padre TagName è uguale a "TBODY" e non "TABLE". Inoltre sto analizzando molti siti Web diversi, quindi questa è una situazione.

SelectNodes sta cercando nel codice HTML originale, non tramite l'albero DOM che ha dopo HtmlDocument.LoadHtml, o non considera gli elementi 'virtuali' aggiunti da esso.

Risposta popolare

Non è necessario utilizzare la gerarchia completa.

Basta usare quanto segue se tutto quello che vuoi sono i td s:

doc.DocumentNode.SelectNodes("//table//td");

o semplicemente ignora il nodo tbody e ottieni tutta la gerarchia che ti interessa:

doc.DocumentNode.SelectNodes("//table//tr/td");


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché