.NET & Html Agility Pack - Parsowanie (analizowanie) kodu dokumentów HTML
W tym artykule chciałbym poruszyć temat parsowania dokumentów HTML w aplikacjach pisanych w oparciu u technologię .NET.
Po co parsować pliki HTML?
Jakiś czas temu stanąłem przed zadaniem napisania fragmentu aplikacji odpowiadającego za wydobywanie odpowiednich informacji z treści plików HTML. Pierwszym rozwiązaniem jakie przyszło mi do głowy, było użycie wyrażeń regularnych (regex-ów). I tak też zrobiłem. Najpierw kod właściwej strony zostawał pobierany, a następnie starałem się przy pomocy odpowiednich selekcji wydobyć pożądane treści. W prostych sytuacjach byłoby to nie takie złe rozwiązanie, jednak tamten przypadek był całkiem złożony. Po stworzeniu kilku wyrażeń regularnych zauważyłem, że wygląda to źle... Regex-y stawały się co raz bardziej zawiłe i miałem spory problem, żeby modyfikować to co powstało kilka minut temu, więc nie było mowy, żeby miał zrozumieć to ktokolwiek inny, czy nawet ja sam, po dłuższej przerwie w kontakcie z tym kodem. Oj nie tędy droga...
Jak nie selekcje wyrażeniami regularnymi, to co?
Gdy zrozumiałem, że podejście trzeba koniecznie zmienić, zadałem sobie pytanie, czy przypadkiem nie istnieją już jakieś gotowe biblioteki pozwalające na wygodne parsowanie treści plików HTML. I tak trafiłem na Html Agility Pack (HAP). Jest to biblioteka pozwalająca na parsowanie dokumentów HTML przy użyciu selektorów XPATH lub XSLT. W pierwszej chwili nieco mnie to wystraszyło, ale jak się okazuje XPATH nie jest niczym skomplikowanym i wystarczy chwila ze stroną z wikipedii (XPATH), żeby móc swobodnie wyciągnąć ze strony interesujące nas elementy. Efekt był taki, że więcej czasu zajęło mi tworzenie poprzednich wyrażeń regularnych, których w końcu i tak nie skończyłem, niż nauczenie się podstaw XPATH i zaimplementowanie całej logiki z wykorzystaniem Html Agility Pack. Dlatego też polecam ten pakiet bardzo serdecznie.
Jak wygląda użycie Html Agility Pack w praktyce?
Na stronie projektu znajdziemy poniższy przykład użycia biblioteki HAP: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");
Na stronie znajduje się jeszcze sporo innych przykładów przesłanych w komentarzach użytkowników i uważam, że warto je przejrzeć bo mi całkiem sporo pomogły. Dodam jeszcze, że choć w powyższym przykładzie analizujemy lokalny plik HTML, to bez problemu uzyskamy również dostęp do źródeł zewnętrznych.
Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!