HtmlAgilityPack - Как прочитать определенную таблицу - c # 4.0 - PullRequest
4 голосов
/ 18 октября 2011

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

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

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

1 Ответ

16 голосов
/ 18 октября 2011

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

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

Нахождение шестой таблицы:

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

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

Поиск таблицы / элемента по id:

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;
}

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

...