#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. Я не знаю ни одного обучающего сайта. Я бы просто рекомендовал найти тот, в котором перечислены операторы, функции и синтаксис, и попробовать написать программы для работы с некоторыми данными. И многое другое.