Анализ HTML с помощью LINQ

c# html html-agility-pack linq

Вопрос

Я пытаюсь взять все ячейки из таблицы HTML, используя Html Agility Pack и LINQ. Я загрузил источник HTML в HtmlAgilityPack.HtmlDocument и выбрал теги с LINQ. Однако после использования foreach для повторения результата он выходит из строя во второй записи.

Это фрагмент источника HTML:

<tr>
    <td class='city'>New York</td>
    <td>Card 1</td>
</tr>
<tr>
    <td class='city'>London</td>
    <td>Card 2</td>
</tr>
<tr>
    <td class='city'>Tokyo</td>
    <td>Card 3</td>
</tr>
<tr>
    <td class='city'>Berlin</td>
    <td>Card 4</td>
</tr>

И это то, что я сделал:

htmlDoc.LoadHtml(await msgRecived.Content.ReadAsStringAsync());

var tds=
    from td in htmlDoc.DocumentNode.Descendants("td")
    where td.Attributes["class"].Value == "city"
    select td.InnerText;

foreach (var td in tds)
{
    citiesText = citiesText + " " + td;
}

Он возвращает только первый элемент, например, если вместо использования foreach я делаю:

citiesText = tds.ElementAt(0);

Он возвращает Нью-Йорк , но если я попробую ElementAt (1), он сработает с ссылкой Object, не установленной в экземпляр объекта.

Любая помощь? благодаря

Принятый ответ

Вы должны убедиться, что Attributes["class"] не null :

var tds =
    from td in doc.DocumentNode.Descendants("td")
    where td.Attributes["class"] != null && td.Attributes["class"].Value == "city"
    select td.InnerText;

Второй извлеченный <td> не имеет атрибута class , поэтому при доступе к Attributes["class"] в этом случае вы получаете null . Вызов. .Value null указывает на исключение.

В качестве альтернативы вы можете использовать GetAttributeValue :

var tds =
    from td in doc.DocumentNode.Descendants("td")
    where td.GetAttributeValue("class", null) == "city"
    select td.InnerText;

Популярные ответы

Просто догадайтесь, но вы, вероятно, только смотрите на td на первый элемент. Может понадобиться

htmlDoc.DocumentNode.Descendants («таблица»).



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow