-1

Есть такая разметка:

<html>
...
<div class="shop-name">rand</div>
...
<div class="shop-name">rand</div>
...
<div class="shop-name">this</div>
...
<div class="shop-name">rand</div>
...
</html>

Как вернуть число 3?
"this" в разметке идет под номером 3.

Спасибо.

A K
  • 28,718
Lebedev
  • 147
  • Распарсите HTML при помощи того же HtmlAgilityPack, достаньте из документа коллекцию упомянутых div’ов и считайте себе на здоровье – Kir_Antipov May 06 '19 at 22:39
  • Спасибо. Я все понял. – Lebedev May 06 '19 at 23:23
  • Сие понимать как сарказм?) – Kir_Antipov May 06 '19 at 23:25
  • Да ) Нашел вот такую штуку var mach = Regex.Matches(s, "<div class="shop-name">this").Count;. Но отдает число сколько раз конструкция встречается, а не по выборке. – Lebedev May 06 '19 at 23:34
  • 2
    Вы это бросьте!) Парсить HTML регулярками - очень плохой тон! Сейчас, 5-15 минут и дам ответ – Kir_Antipov May 06 '19 at 23:35

2 Answers2

3

Обязательно познакомьтесь с библиотекой HtmlAgilityPack!

Вот пример, который решает Вашу проблему:

public static int GetShopIndex(string HTML, string ShopName)
{
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(HTML);
    return doc.DocumentNode
        .SelectNodes("//html//div[@class='shop-name']")? // Выбираем интересующие нас узлы по xpath
        .Select((x, i) => new { Text = x.InnerText, Index = i }) // Комбинируем внутренний текст и номер узла
        .FirstOrDefault(x => x.Text == ShopName)?.Index ?? -1;  // Возвращаем индекс узла, текст которого равен заданному
                                                                // Если такого нет - возвращаем -1
}

Использование:

int i = GetShopIndex("<html><div class='shop-name'>rand</div><div class='shop-name'>this</div></html>", "this");
//i == 1

Если отсчет с 0 Вас по каким-то причинам не устраивает, просто добавьте единичку)

Kir_Antipov
  • 4,642
2

Дополненю @Kir_Antipov могу дать ответ на альтернативной библиотеке парсинга — AngleSharp:

var html = @"<html>
        <div class=""shop-name"">rand</div>
        <div class=""shop-name"">rand</div>
        <div class=""shop-name"">this</div>
        <div class=""shop-name"">rand</div>
    </html>";

var parser = new HtmlParser();
var document = parser.ParseDocument(html);
var elements = document.QuerySelectorAll("div.shop-name").Select(x => x.TextContent).ToArray();

// выводим все
foreach (var element in elements)
{
    Console.WriteLine($"{element}");
}

// выводим третий элемент
Console.WriteLine($"Третий элемент: {elements[3]}");

введите сюда описание изображения

Ссылки по теме:

Нумерация если нужна, то linq такое же:

Select((x, i) => new { Index = i, Text = x.TextContent })

введите сюда описание изображения

A K
  • 28,718