Web design, Web development, Web hosting & Network administration

Html parsing με το HtmlAgilityPack και Windows-1253 greek encoding

Το HtmlAgilityPack είναι ένας Html parser για την πλατφόρμα .NET και υποστηρίζει XPATH και XSLT parsing. Μας δίνει την δυνατότητα να διαχειριστούμε το DOM με όποιον τρόπο θέλουμε με μεγάλη ευκολία και είναι πολύ ανεκτικό στο κακοδιαμορφωμένο Html που πολλές φορές μπορεί να συναντήσουμε sto web.Το object model μοιάζει πολύ με αυτό που προτείνει το System.Xml αλλά για Html documents. Επίσης το HtmlAgilityPack υποστηρίζει και Linq to Objects (μέσω Linq to Xml Like Interface).

Παραδείγματα εφαρμογής:
  • Διόρθωση σελίδας ή παραγωγή Html. Μπορείτε να "φτιάξετε" μια σελίδα με τον τρόπο που θέλετε, να προσθέσετε / αντιγράψετε / διαγράψετε nodes, να πειράξετε το DOM κλπ.
  • Web scanners. Μπορείτε εύκολα να διαβάσετε τα img/src ή a/href με ελάχιστα XPATH queries.
  • Web scrappers. Μπορείτε για παράδειγμα να μετατρέψετε εύκολα μια υπάρχουσα σελίδα σε RSS, με μόνο ένα XSLT αρχείο που θα χρησιμεύει για binding.
Παράδειγμα κώδικα (C#):

HtmlDocument doc = new HtmlDocument();
 doc.Load("file.htm");
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
 {
    HtmlAttribute att = link["href"];
    att.Value = FixLink(att);
 }
 doc.Save("file.htm");


Ένα πρόβλημα που συνάντησα με το HtmlAgiltyPack ήταν κατά το parsing σελίδας με ελληνικό κείμενο και encoding windows-1253. Για κάποιο λόγο οι ελληνικοί χαρακτήρες δεν εμφανίζονταν σωστά και δεν μπορούσα να το διορθώσω ότι encoding και να έβαζα στο HtmlDocument. Ο κώδικας με το πρόβλημα:

HtmlWeb web = New HtmlWeb();
HtmlDocument doc = New HtmlDocument();
doc = web.Load("http://www.site-with-greek-encoding.com");
doc.OptionDefaultStreamEncoding = Encoding.GetEncoding("windows-1253");


Τελικά αναγκάστηκα να διαβάσω το html από τη σελίδα με τον παραδοσιακό τρόπο και ύστερα να το κάνω parse με το HtmlAgilityPack όπως παρακάτω:

HtmlDocument doc = New HtmlDocument();
WebRequest req  = WebRequest.Create("http://www.site-with-greek-encoding");
StreamReader stream  = New StreamReader(req.GetResponse().GetResponseStream(), Encoding.GetEncoding("windows-1253"));
doc.LoadHtml(stream.ReadToEnd());


Το project στο Codeplex:
http://htmlagilitypack.codeplex.com
Tags: HtmlAgilityPack, HtmlDocument, DOM, greek encoding, streamreader, html parsing

Σχόλια

Re: Html parsing με το HtmlAgilityPack και Windows-1253 greek encoding

Τρίτη, 18 Μαΐου 2010, 8:12 πμ από Nikolaos

Eixa to idio provlhma kai to elysa kai gw me patenta alla o parapano tropos einai poly pio katharos.