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