HTMLAgilityPack - обнаружение пустой таблицы? - PullRequest
0 голосов
/ 07 февраля 2012

Я использую c # с htmlagilitypack. Все работает хорошо, за исключением случаев, когда таблица, которую я ищу, не содержит строк. Я пытаюсь прочитать только данные из 1-й таблицы на странице. Проблема в том, что если в первой таблице нет строк, пакет htmlagilitypack почему-то переходит ко второй таблице.

HTML, который я пытаюсь прочитать, выглядит примерно так:

<table class='stats'>
    <tr>
      <td colspan='2'>This is the 1st table</td>
    <tr>
      <td>Column A</td>
      <td>Column B</td>
    </tr>
    <tr>
      <td>Value A</td>
      <td>Value B</td>
    </tr>
</table>

<table class='stats'>
    <tr>
      <td colspan='2'>This is the 2nd table</td>
    <tr>
      <td>Column 1</td>
      <td>Column 2</td>
    </tr>
    <tr>
      <td>Value 111</td>
      <td>Value 222</td>
    </tr>
</table>

Затем я получаю значения первой таблицы, используя следующую строку:

foreach (HtmlNode node in root.SelectNodes("//table[@class='stats']/tr[position() > 2]/td"))

Как мне получить данные, которые я собираю, только из 1-й таблицы?

Спасибо.

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Вы можете убедиться, что выбираете только первую таблицу соответствия, используя индекс позиции [1] после селектора таблицы.

Попробуйте следующее:

"//table[@class='stats'][1]/tr[position()>2]/td"

Если в первой таблице нет строк, вы получите null назад, поэтому вам следует проверить это перед повторением в foreach.

Например, вы можете сделать следующее:

var elements = root.SelectNodes("//table[@class='stats'][1]/tr[position()>2]/td");
if (elements != null)
{
  foreach (HtmlNode node in elements)
  {
    // process the td node
  }
}
0 голосов
/ 07 февраля 2012

Вам необходимо иметь идентификатор в таблице или строке, который однозначно идентифицирует таблицу или или, а затем использовать идентификатор в xpath.

...