È possibile utilizzare Html Agility Pack per analizzare i frammenti HTML?

.net c# html html-agility-pack parsing

Domanda

Ho bisogno di ottenere elementi LINK e META dalle pagine ASP.NET, dai controlli utente e dalle pagine master, prendere il loro contenuto e poi scrivere di nuovo i valori aggiornati a questi file in un'utilità su cui sto lavorando.

Potrei provare a usare espressioni regolari per afferrare solo questi elementi, ma ci sono diversi problemi con questo approccio:

  • Mi aspetto che molti dei file di input contengano codice HTML spezzato (elementi mancanti / fuori sequenza, ecc.)
  • Elementi SCRIPT che contengono commenti e / o VBScript / JavaScript che assomigliano a elementi validi, ecc.
  • Devo essere in grado di commentare condizionatamente i commenti condizionali di IE e gli elementi META e LINK all'interno dei commenti condizionali di IE
  • Per non parlare di come HTML non è una lingua normale

Ho fatto qualche ricerca per i parser HTML in .NET e molti post e blog SO raccomandano l' HTML Agility Pack . Non l'ho mai usato prima e non so se può analizzare frammenti HTML e HTML spezzati. (Ad esempio, immagina un controllo utente che contenga solo un elemento HEAD con qualche contenuto in esso - nessun HTML o BODY .) So che potrei leggere la documentazione ma mi farebbe risparmiare un po 'di tempo se qualcuno potesse consigliarti. (La maggior parte dei post SO comporta l'analisi di pagine HTML complete.)

Risposta accettata

Assolutamente, questo è ciò a cui eccelle.

In effetti, molte pagine Web che troverai in natura potrebbero essere descritte come frammenti HTML, a causa della mancanza di tag <html> o di tag non correttamente chiusi.

HtmlAgilityPack simula ciò che il browser deve fare: cerca di dare un senso a quello che a volte è un guazzabuglio di tag non corrispondenti. Una scienza imperfetta, ma HtmlAgilgityPack lo fa molto bene.


Risposta popolare

Un'alternativa a Html Agility Pack è CsQuery , una porta jQuery C # di cui sono l'autore principale. Ti consente di utilizzare selettori CSS e l'API Query completa per accedere e manipolare il DOM, che per molte persone è più semplice di XPATH. Inoltre, il parser HTML è progettato specificatamente per una varietà di scopi e ci sono diverse opzioni per l'analisi dell'HTML: come documento completo ( html, body mancante html, body tag html, body verranno aggiunti e qualsiasi contenuto orfano spostato all'interno del corpo); come blocco del contenuto (nel senso che non verrà incapsulato come documento completo, ma tag facoltativi come tbody che sono ancora obbligatori nel DOM vengono aggiunti automaticamente, come fanno i browser) e come un vero frammento in cui non ci sono tag creato (ad esempio nel caso in cui si sta solo lavorando con blocchi predefiniti).

Vedi la creazione di un nuovo DOM per i dettagli.

Inoltre, il parser HTML di CsQuery è stato progettato per rispettare le specifiche HTML5 per i tag di chiusura opzionali. Ad esempio, la chiusura di tag p è facoltativa, ma esistono regole specifiche che determinano quando il blocco deve essere chiuso. Per produrre lo stesso DOM utilizzato da un browser, il parser deve implementare le stesse regole. CsQuery fa questo per fornire un alto grado di compatibilità con il DOM del browser per una determinata fonte.

L'utilizzo di CsQuery è molto semplice, ad es

CQ docFromString = CQ.Create(htmlString); 
CQ docFromWeb = CQ.CreateFromUrl(someUrl);

// there are other methods for asynchronous web gets, creating from files, streams, etc.

// css selector: the indexer [] is like jQuery $(..)

CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];

// Text() is a jQuery method returning text contents of selection 

string textOfCell = lastCellInFirstRow.Text();

Infine CsQuery indicizza i documenti su classe, id, attributo e tag, rendendo i selettori estremamente veloci rispetto a Html Agility Pack.



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é