Я пытаюсь взять все ячейки из таблицы 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 («таблица»).