Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Loop em tags com expressão regular

Olá pessoal, estou com uma dúvida, como posso estar fazendo um loop em uma div que se repete várias vezes, com Regex em .NET? Por exemplo quero pegar as [div class="g"] do exemplo abaixo, e trabalhar nos textos do h3 e span:

<div id="search">
    <ol>
        <div class="g">
            <h3>...</h3>
            <div class="z">
                <span>...</span>
            </div>
        </div>
        <div class="g">
            <h3>...</h3>
            <span>...</span>
        </div>
        <div class="g">
            <h3>...</h3>
            <div class="z">
                <span>...</span>
            </div>
        </div>
        <div class="g">
            <h3>...</h3>
            <span>...</span>
        </div>
        <div class="g">
            <h3>...</h3>
            <div class="z">
                <span>...</span>
            </div>
        </div>
        <div class="g">
            <h3>...</h3>
            <span>...</span>
        </div>
    </ol>
</div>
2 respostas
solução!

Opa, Lucas. Tudo bom?

Neste tipo de problema, regex não é a melhor solução.

Pesquisei um pacote do NuGet que faz o parsing de html e retorna seus valores. Encontrei o HtmlAgilityPack.NetCore.

No meu exemplo a seguir, estou usando alguns recursos mais avançados do C#, como o Linq e expressões lambda. Se parecer confuso agora, faça os próximos cursos da série de C# que estes conceitos ficarão mais claros!

Antes de tudo, instale o pacote pelo gerenciador de pacotes do NuGet com o comando:

Install-Package HtmlAgilityPack.NetCore

Feito isso, adicione a diretiva using HtmlAgilityPack;.

O código a seguir vai retornar o texto dentro das div com classe g:

HtmlDocument doc = new HtmlDocument();
string html = @"
<div id=""search"">
    < ol >
        < div class=""g"">
            <h3>1</h3>
            <div class=""z"">
                <span>2</span>
            </div>
        </div>
        <div class=""g"">
            <h3>3</h3>
            <span>4</span>
        </div>
        <div class=""g"">
            <h3>5</h3>
            <div class=""z"">
                <span>6</span>
            </div>
        </div>
        <div class=""g"">
            <h3>7</h3>
            <span>8</span>
        </div>
        <div class=""g"">
            <h3>9</h3>
            <div class=""z"">
                <span>10</span>
            </div>
        </div>
        <div class=""g"">
            <h3>11</h3>
            <span>12</span>
        </div>
    </ol>
</div>";
doc.LoadHtml(html);


var nodes =
    doc.DocumentNode.Descendants("div")
        .Where(x => x.Attributes["class"] != null && x.Attributes["class"].Value == "g")
        .ToList();

foreach (var node in nodes)
{
    Console.WriteLine(node.InnerText);
}

O que você acha? Ficou com alguma dúvida do código? Abs.

Olá Guilherme!

Obrigado, estendo sim. Este pack é muito bom, obrigado pela ajuda!