2009-06-30 14 views
52

Html Agility Pack è stato dato come risposta a un StackOverflow question qualche tempo fa, è ancora l'opzione migliore? Quali altre opzioni dovrebbero essere considerate? C'è qualcosa di più leggero?Html Agility Pack è ancora il miglior parser .NET HTML?

+0

La mancanza di un parser HTML è un'omissione evidente dalla libreria standard .NET. "Fai una richiesta http e analizza la risposta" è pane e burro nell'era del web, il secondo programma che le persone scrivono dopo "Ciao mondo". –

+0

@ColonelPanic, in questi giorni con la maggior parte delle pagine Web che utilizzano jscript per ottenere i dati, è necessario più di un parser HTML. –

+0

Vedere la recensione del dicembre 2015 http://forcewake.me/how-to-parse-html-in-dotnet/, AngleSharp viene mantenuto attivamente (https://dotnet.libhunt.com/project/anglesharp/vs/htmlagilitypack) –

risposta

49

C'è un spreadsheet con i confronti.

In sintesi:

CsQuery prestazioni vs. Html Agility Pack and Fizzler ho messo insieme alcuni test di performance per confrontare CsQuery al solo pratico alternativa che io sappia (Fizzler, un'estensione HtmlAgilityPack). I testato contro tre diversi documenti:

  • Il documento di prova sfrigolio (circa 11 k)
  • la voce di Wikipedia per "formaggio" (circa 170 k)
  • La singola pagina HTML 5 spec (circa 6 megabyte)

I risultati complessivi sono:

  • HAP è più veloce a caricare la stringa di codice HTML in un n modello di oggetto. Questo ha senso, dal momento che non penso che Fizzler costruisca un indice (o forse ne costruisca solo uno relativamente semplice). CsQuery richiede ovunque da 1,1 a 2,6 volte più lungo per caricare il documento. Maggiori informazioni su questo di seguito.
  • CsQuery è più veloce per quasi tutto il resto. A volte da fattori di 10.000 o più. L'unica eccezione è il selettore "*", dove a volte Fizzler è più veloce. Per tutti i test, i risultati sono completamente enumerati ; questo caso ha come risultato solo l'enumerazione di ogni nodo dell'albero . Quindi questo non prova il motore di selezione tanto quanto la struttura dati .
  • CsQuery ha svolto un lavoro migliore restituendo gli stessi risultati di un browser. Ciascuno dei selettori qui è stato verificato rispetto allo stesso documento in Chrome utilizzando jQuery 1.7.2 e i numeri corrispondono a quelli restituiti da CsQuery. Ciò è probabilmente dovuto al fatto che HtmlAgilityPack gestisce i tag opzionali (mancanti) in modo diverso. Inoltre, nth-child non è implementato completamente in Fizzler - supporta solo valori semplici (non le formule).
+0

Anche l'awesonium dovrebbe far parte di questo elenco. È ancora più bello, può valutare ed eseguire Javascript! – jessehouwing

+0

http://www.awesomium.com/ – jessehouwing

+2

Html Agility Pack è parser HTML non browser senza testa come Awesonium. –

2

Ho usato questo, piuttosto facile da scorrere api. Penso che nel dominio C# /. Net questa sia un'ottima scelta.

C'è una libreria java here. Sembra piuttosto buono anche se non ho esperienza personale.

1

Se siete pronti a guardare al di fuori del mondo .NET, il Python SO comunità raccomanda Beautiful Soup, per esempio html-parser-in-python.

Beautiful Soup è un parser/XML Python HTML progettato per i progetti di turnaround veloci come screen-scraping.

9

Html Agility Pack è stato dato come la risposta a una domanda StackOverflow qualche tempo fa

Agility pacchetto HTML è ancora una soluzione eccezionale per il parsing HTML.

è ancora l'opzione migliore?

Il migliore? beh, tutto dipende dal compito a portata di mano, ma generalmente lo penso. Ci sono occasioni in cui non è l'ideale, ma generalmente farà un ottimo lavoro.

C'è qualcosa di più leggero?

Si potrebbe provare questo: http://csharptest.net/browse/src/Library/Html/ Non è niente di più che una mano piena di file di origine che raccolgono oltre HTML/XML tramite Regex. Supporta un DOM leggero e XPath ma non molto altro. (help contents)

[Esempio]

public void TestParse() { 
     string notxml = "<html id=a ><body foo='bar' bar=\"foo\" />"; 
     var html = new HtmlLightDocument(notxml).Root; 

     Assert.AreEqual("html", html.TagName); 
     Assert.AreEqual(1, html.Attributes.Count); 
     Assert.AreEqual("a", html.Attributes["id"]); 
     Assert.AreEqual(1, html.Children.Count); 
} 

In alternativa è possibile utilizzare il parser direttamente invece di costruire un albero DOM. Basta implementare l'interfaccia IXmlLightReader e chiamare il metodo statico XmlLightParser.Parse.

PS: è stato scritto per risolvere un dibattito interno: che Regex può analizzare HTML! Da allora abbiamo trovato molti usi perché è abbastanza leggero da essere inserito ovunque. Ci sono ancora modi per confondere il generatore di gerarchia DOM, ma non ho trovato alcun HTML che il parser non gestirà.

+0

C'è un 'EsempioAttributo' che viene usato nel testo. =) –

33

Quando si parla di parsing HTML, non c'è paragone con la realtà. Questo è un parser C# port of the validator.nu. Questa è la stessa base di codice utilizzata dai browser basati su Gecko (ad esempio Firefox). Ci repo sembra un po 'polveroso ma non lasciatevi ingannare .. il porto è eccezionale. E 'stato semplicemente trascurato. L'ho integrato in CsQuery circa un mese fa. Supera tutti i test CsQuery (che includono la maggior parte dei test jQuery e Sizzle portati su C#).

Non sono a conoscenza di altri parser HTML5 scritti in C#, o anche di quelli che vengono lontanamente vicini a fare un buon lavoro in termini di gestione dei tag mancante, facoltativa e non valida. Questo non è solo un ottimo lavoro, è conforme agli standard.

Il repository che ho collegato sopra è la porta originale, include un wrapper di base che produce un albero di nodi XML. Le versioni di CsQuery 1.3 e successive utilizzano questo parser.

+8

Ho imparato ad amare il fatto che la risposta accettata sia un link a un articolo sul tuo blog e un paragrafo che cita _you_. +400 reputazione per la vittoria, Haha. –

2

best è un termine molto relativo, per la tua domanda, immagino tu stia cercando uno strumento affidabile, quindi penso che questa funzione dovrebbe essere presa in considerazione. Cercherei il supporto e la forza dell'azienda che fornisce lo strumento. È una sensazione orribile quando si tenta di contattare il supporto per qualsiasi strumento che utilizza e la risposta è, questa azienda non esiste più. Dato che HAP è gestito dalla comunità degli sviluppatori, preferirei fidarmi di lei.

7

C'è anche AngleSharp

AngleSharp è una libreria .NET che ti dà la possibilità di analizzare parentesi angolare basate iper-testi come HTML, SVG, MathML e. XML senza convalida è anche supportato dalla libreria. Un aspetto importante di AngleSharp è che anche i CSS possono essere analizzati. Il parser è costruito sulla specifica W3C ufficiale. Ciò produce una rappresentazione DOM HTML5 perfettamente portabile del codice sorgente specificato. Anche le funzioni correnti come querySelector o querySelectorTutte funzionano per l'attraversamento dell'albero.

Problemi correlati