Parsowanie HTML w C# – Aplikacje Desktopowej – WPF

1. Co to w ogóle znaczy „parsowanie HTML”?

HTML to zwykły tekst, który opisuje strukturę strony:

  • nagłówki
  • akapity
  • linki
  • obrazki
  • tabele

Parsowanie HTML w C# oznacza:

wczytać kod HTML strony i wyciągnąć z niego konkretne informacje
np. tytuły, ceny, daty, treść artykułu.

https://www.w3schools.com/whatis/img_htmltree.gif
https://hyno.co/images/Blogs/a%20screenshot%20of%20a%20html%20code.png
https://media.geeksforgeeks.org/wp-content/uploads/20200516001841/Untitled-Diagram107.png

Przykład z życia:

  • Otwierasz stronę pogodową
  • Ty widzisz temperaturę
  • Program widzi tylko HTML
  • My uczymy program jak znaleźć tę temperaturę w kodzie

2. Po co to się robi w aplikacjach WPF?

Najczęstsze powody:

  • pobieranie danych z internetu (bez API)
  • aktualności, komunikaty, ogłoszenia
  • ceny, rankingi, rozkłady
  • dane do projektów szkolnych (INF.04 ❤️)

W WPF:

  • parsujesz HTML w logice
  • a wynik pokazujesz w Label / TextBlock / ListView

3. Jak wygląda droga „od strony do danych”?

Zawsze te 4 kroki:

  1. Pobranie HTML strony
  2. Wczytanie HTML do parsera
  3. Wyszukanie elementów
  4. Wyciągnięcie tekstu / atrybutów

Zapamiętaj to – to się NIE zmienia.


4. Czym w C# parsujemy HTML?

Najprościej i najczytelniej:
👉 HtmlAgilityPack

To biblioteka, która:

  • rozumie HTML jak przeglądarka
  • tworzy tzw. drzewo DOM
  • pozwala szukać elementów po tagach, klasach, id

5. Instalacja w Visual Studio (krok po kroku)

  1. Projekt WPF
  2. PPM na projekt → Zarządzaj pakietami NuGet
  3. Zakładka Przeglądaj
  4. Wpisz:HtmlAgilityPack
  5. Zainstaluj

I tyle. Nic więcej.


6. Najprostszy przykład – pobieramy HTML strony

Metoda: pobierz stronę jako tekst

using System.Net.Http;

public async Task<string> PobierzHtmlAsync(string adres)
{
    using (HttpClient klient = new HttpClient())
    {
        return await klient.GetStringAsync(adres);
    }
}

Co tu się dzieje?

  • HttpClient → udaje przeglądarkę
  • GetStringAsync → pobiera czysty HTML
  • async / await → żeby nie zawiesić aplikacji

💡 Dlaczego async?
Bo internet jest wolny. WPF nie może się zawieszać.


7. Wczytanie HTML do parsera

using HtmlAgilityPack;

public HtmlDocument WczytajDokument(string html)
{
    HtmlDocument dokument = new HtmlDocument();
    dokument.LoadHtml(html);
    return dokument;
}

Tu dzieje się magia:

  • tekst HTML
  • zamienia się w drzewo elementów

8. Jak znaleźć element w HTML?

Załóżmy, że strona ma:

<h1 class="title">Aktualności</h1>

Szukamy tego w C#

HtmlNode naglowek = dokument.DocumentNode
    .SelectSingleNode("//h1[@class='title']");

Co oznacza ten zapis?

  • //h1 → znajdź wszystkie <h1>
  • @class='title' → tylko z tą klasą
  • SelectSingleNode → weź pierwszy pasujący

9. Jak wyciągnąć tekst?

string tekst = naglowek.InnerText;

To jest to, co człowiek widzi na stronie.


10. Całość w jednej metodzie (czytelnie dla ucznia)

public async Task<string> PobierzNaglowekAsync()
{
    string html = await PobierzHtmlAsync("https://przykladowastrona.pl");

    HtmlDocument dokument = new HtmlDocument();
    dokument.LoadHtml(html);

    HtmlNode naglowek = dokument.DocumentNode
        .SelectSingleNode("//h1");

    if (naglowek != null)
        return naglowek.InnerText.Trim();

    return "Brak danych";
}

11. Jak pokazać to w WPF?

private async void Button_Click(object sender, RoutedEventArgs e)
{
    string wynik = await PobierzNaglowekAsync();
    LabelWynik.Content = wynik;
}

💡 Dlaczego w Click też async?
Bo czekamy na internet.


12. Najczęstsze błędy uczniów

❌ parsowanie bez async
❌ szukanie złej klasy / taga
❌ strona ładowana JavaScriptem (HTML jest pusty)
❌ brak sprawdzania null


13. Ważna prawda (bardzo egzaminacyjna)

Parser HTML nie widzi JavaScriptu

Jeśli strona:

  • ładuje dane dynamicznie
    to:
  • HtmlAgilityPack ich nie zobaczy

Wtedy:

  • albo API
  • albo WebView
  • albo Selenium (ciężki temat)