HTML Agility Pack с использованием вопросов XPATH

Я использую этот код, чтобы получить все таблицы в моем html-документе:

var tables = document.DocumentNode.SelectNodes("table[@class='something']");

Внутри каждой таблицы у меня есть несколько строк и несколько столбцов. У меня есть что-то вроде этого до сих пор:

HtmlNodeCollection rows = tables[0].SelectNodes(".//TR");
for (int i = 0; i < rows.Count; ++i)
{
    HtmlNodeCollection cols = rows[i].SelectNodes(".//TD");

    for (int j = 0; j < cols.Count; ++j)
    {
        string value = cols[j].InnerText;
    }
}

Мне нужна помощь, чтобы понять, как использовать XPATH, так как я не могу найти онлайн-документацию. Например, как я могу получить содержимое, если мой html-документ выглядит следующим образом:

<table class="something">
  <colgroup>...</colgroup>
  <thead>
    <tr>
      <td>...</td>
    </tr>
  </thead>
  <thead>...</thead>
  <tbody>
    <tr>
      <td>...</td>
      <td>...</td>
    </tr>
    <tr>
      <td>...</td>
      <td>...</td>
    </tr>
  </tbody>
</table>

Я только хочу, что содержание "td"


person M. Coutinho    schedule 19.04.2014    source источник
comment
Пожалуйста, помогите мне найти примеры, не относящиеся к теме SO. (Если я неправильно понял ваш вопрос, рассмотрите возможность его редактирования, чтобы было ясно, что вы ищете/ожидаете). Этот поиск поможет вам начать работу — bing.com/search?q=xpath+samples . Если вам нужны подробности, см. спецификацию XPath. Обычно вы обнаружите, что примеры XPath применяются для поиска в XML — они применимы непосредственно к вашему случаю, поскольку по сути это то, что делает HtmlAgilityPack — преобразует HTML свободной формы в XML-дерево.   -  person Alexei Levenkov    schedule 19.04.2014


Ответы (1)


Запрос XPath для получения td тегов, расположенных внутри table с классом "что-то", выглядит следующим образом:

var nodes = document.DocumentNode.SelectNodes(@"//table[@class=""something""]//td");

Это означает:

  • // выбирает узлы в документе из текущего узла, которые соответствуют выбору, независимо от того, где они находятся
  • //table[@class="something"] выбирает table тегов с атрибутом class, равным «чему-то» в любом месте документа.
  • //table[@class="something"]//td выбирает td теги, у которых в качестве родителя, прародителя или гранд-родителя используется тег table
person meziantou    schedule 19.04.2014
comment
поэтому, если использовать //table//tbody//td, он получает все теги td внутри tbody? - person M. Coutinho; 19.04.2014
comment
С указанным HTML, да. Вы также можете использовать //table/tbody//td, потому что tbody является прямым потомком table. Обратите внимание, что в thead вы должны использовать th вместо td. Если вы это сделаете, предлагаемый запрос XPath будет работать без указания tbody - person meziantou; 19.04.2014