Wyszukiwanie złożonego tagu HTML i pobieranie jego zawartości

0

Od dłuższej chwili zastanawiam się jak pobrać tekst umieszczony pomiędzy tagiem table.
Ma kilka argumentów:

<table class="data" cellspacing="0" cellpadding="0">
// treść do pobrania
</table>

Dodam, że będzie ich kilka do pobrania z stringa wejściowego. Jak to zrobić? Chodzi mi tylko o samo wnętrze tabelki.

0

Wyrażenia regularne albo parser HTML, np. taki: http://htmlagilitypack.codeplex.com/ (należy pamiętać, że w rzeczywistości strona HTML prawie nigdy nie jest poprawnym dokumentem XML).

0

należy pamiętać, że w rzeczywistości strona HTML prawie nigdy nie jest poprawnym dokumentem XML

To mnie właśnie przeraża i odsuwa od tego rozwiązania.

A jak po kolei przeszukiwać tekst w poszukiwaniu tego ciągu:
<table class="data" cellspacing="0" cellpadding="0">

Po znalezieniu tego ciągu wyszukam najbliższy /table i skopiuje tekst między tymi pozycjami. Jak to zrobić?

2

Wyrażenia regularne. Wklep do wyszukiwarki i próbuj.

Jak już jakieś wyrażenie napiszesz i nie będzie do końca działać to będziemy nad nim myśleć.

0

Niestety próbowałem z googlowskich gotowców i nic mi nie działa :(
Czy możesz podać przykład?

0

Przypadkiem ostatnio pisałem podobne wyrażenie regularne. Rzadko mi się to zdarza, więc efekt jest zapewne słaby.

Regex regex = new Regex(@"<table.*class=""data"".*>(.+)</table>", RegexOptions.Multiline);
MatchCollection matches = regex.Matches(pageData);
foreach (Match match in matches)
{
    string content = match.Groups[1].Value;
    Console.WriteLine(content);
}

Ogólnie do zabawy z Regexami polecam wtyczkę do VS RegexTester.

0

Po uzupełnieniu tej reguły:

Regex regex = new Regex(@"<table.*class=""data"".*cellpadding=""0"".*cellspacing=""0"".*>(.+)</table>", RegexOptions.Multiline);
                MatchCollection matches = regex.Matches(richTextBox1.Text);
                foreach (Match match in matches)
                {
                    string content = match.Groups[1].Value;
                    MessageBox.Show(content.ToString());
                }

Mimo że w tekście istnieją takie ciągu, nic nie znajduje (skopiowałem tekst do notatnika i po wyszukiwaniu poniższego ciągu pokazało 5 wyników:)

0

Pomoże ktoś?

Cześć. Czy ktoś jest w stanie mi pomóc?

0

Kod podany przez kolegę wyżej działa ale nie do końca prawidłowo:

Regex regex = new Regex(@"<table.*class=""data"".*>(.+)</table>", RegexOptions.Multiline);
                MatchCollection matches = regex.Matches(input);
                foreach (Match match in matches)
                {
                    string content = match.Value;
                }

Kod do content wrzuca mi sporo kodu HTML ale niestety wszystkie tabelki mam w conent a chciałbym każdą rozdzielić na osobną, do tablicy string.
Jak powinien wygląda kod?

0

Nie obawiaj się, że dokument HTML niemal zawsze nie jest dokumentem XML. Podana wyżej biblioteka HtmlAgilityPack została stworzona do takich własnie operacji i działa znakomicie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1