HtmlAgilityPack — Как прочитать определенную таблицу — c # 4.0

#c# #html-agility-pack

#c# #html-пакет гибкости

Вопрос:

Используя c # 4.0 и htmlagilitypack, как я могу читать значения внутри определенной таблицы. Я имею в виду, допустим, есть 10 таблиц, и я хочу прочитать значения из 6-го, или у меня есть идентификатор таблицы.

Или, допустим, я хочу прочитать значение td, приходящее после определенного td.

Или таблица, идущая после определенного div или элемента или текста. Возможно ли это?

Комментарии:

1. О чем ты говоришь? Показать разметку. Объясните, что вам нужно извлечь.

2. Что вы пробовали? Достойный старт здесь: 4guysfromrolla.com/articles/011211-1.aspx Я бы прочитал это, попробовал то, что вы упомянули, и, если у вас это не получается, вернулся бы к более конкретным ситуациям.

3. спасибо за ссылку. например, на странице может быть много таблиц. допустим, я хочу получить таблицу после определенного ключевого слова или элемента div. Как я могу это сделать? чтение элементов после определенных разметок.

4. Удалено (ненужное) замечание в документации библиотеки.

5. Прекратите писать текст и вставьте пример HTML в свой вопрос. На примере того, какой у вас есть ввод и какой результат вы ожидаете, это может помочь. Без этого это невозможно.

Ответ №1:

Все, о чем вы спрашивали, можно было бы сделать относительно легко. Не имеет значения, что его документация может отсутствовать, она должна быть похожа на XML и сетевую XmlDocument реализацию как в использовании, так и в функциональности.

Как я могу прочитать значения внутри определенной таблицы? Допустим, есть 10 таблиц, и я хочу прочитать значения из 6-го или у меня есть идентификатор таблицы.

Поиск 6-й таблицы:

 // XPath
var table6 = doc.DocumentNode.SelectSingleNode("//table[6]");

// LINQ
var table6 = doc.DocumentNode.Descendants("table").Skip(5).FirstOrDefault();
  

Поиск таблицы / элемента по идентификатору:

 var myTable = doc.GetElementById("myTable");

// XPath
var myTable = doc.DocumentNode.SelectSingleNode("//table[@id='myTable']");
var myTable = doc.DocumentNode.SelectSingleNode("//*[@id='myTable']");

// LINQ
var myTable = doc.DocumentNode
    .Descendants("table")
    .Where(table => table.Attributes.Contains("id"))
    .SingleOrDefault(table => table.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .Where(e => e.Attributes.Contains("id"))
    .SingleOrDefault(e => e.Attributes["id"].Value == "myTable");
var myTable = doc.DocumentNode
    .Descendants("table")
    .SingleOrDefault(table => table.GetAttributeValue("id", null) == "myTable");
var myTable = doc.DocumentNode
    .Descendants()
    .SingleOrDefault(e => e.GetAttributeValue("id", null) == "myTable");
  

Допустим, я хочу прочитать значение td, идущее после определенного td.

 // XPath
var certainTd = table6.SelectSingleNode("//td[2]");
var tdAfterCertainTd = certainTd.SelectSingleNode("following-sibling::td[1]");

// LINQ (not so easy)
var certainTd = table6.Descendants("td").Skip(1).FirstOrDefault();
var tdAfterCertainTd = certainTd.NextSibling;
while (tdAfterCertainTd != null)
{
    if (tdAfterCertainTd.Name == "td")
        break;
    tdAfterCertainTd = tdAfterCertainTd.NextSibling;
}
  

Таблица, следующая после определенного div или элемента или текста.

 // XPath
var certainDiv = doc.DocumentNode.SelectSingleNode("//div[1]");
var tableAfterCertainDiv = certainDiv.SelectSingleNode("following-sibling::table[1]");

// LINQ (not so easy)
var certainDiv = doc.DocumentNode.Descendants("div").FirstOrDefault();
var tableAfterCertainDiv = certainDiv.NextSibling;
while (tableAfterCertainDiv != null)
{
    if (tableAfterCertainDiv.Name == "table")
        break;
    tableAfterCertainDiv = tableAfterCertainDiv.NextSibling;
}
  

Вы должны заметить некоторые закономерности.

Комментарии:

1. спасибо, отличный ответ. есть ли какое-нибудь место, где я могу изучить xpath. любая хорошая учебная электронная книга или видео. Спасибо.

2. Я не знаю ни одного обучающего сайта. Я бы просто рекомендовал найти тот, в котором перечислены операторы, функции и синтаксис, и попробовать написать программы для работы с некоторыми данными. И многое другое.