XPath сбрасывает содержимое столбца td на странице HTML для очистки экрана

Ниже вы найдете отрывок кода, используемого для скрининга экономического календаря. HTML-страница, которую она анализирует с помощью XPath, включает эту строку в качестве первой строки таблицы. (Вставьте только эту строку вместо всей HTML-страницы.)

<tr class="calendar_row newday singleevent" data-eventid="42064"> <td class="date"><div class="date">Sun<div>Dec 23</div></div></td> <td class="time">All Day</td> <td class="currency">JPY</td> <td class="impact"> <div title="Non-Economic" class="holiday"></div> </td> <td class="event"><div>Bank Holiday</div></td> <td class="detail"><a class="calendar_detail level1" data-level="1"></a></td> <td class="actual"> </td> <td class="forecast"></td> <td class="previous"></td> <td class="graph"></td> </tr>

Этот код, который выбирает первую строку tr, используя XPath:

var doc = new HtmlDocument();
doc.Load(new StringReader(html));
var rows = doc.DocumentNode.SelectNodes("//tr[@class=\"calendar_row\"]");
var rowHtml = rows[0].InnerHtml;

Проблема в том, что rowHtml возвращает это:

<td class="date"></td> <td class="time">All Day</td> <td class="currency">EUR</td> <td class="impact">  <div title="Non-Economic" class="holiday"></div>  </td> <td class="event"> <div>French Bank Holiday</div> </td> <td class="detail"><a class="calendar_detail level2" data-level="2"></a></td> <td class="actual"> </td> <td class="forecast"></td> <td class="previous"></td> <td class="graph"></td>

Теперь вы можете видеть, что содержимое столбца td для даты исчезло! Зачем?

Я экспериментировал со многими вещами и озадачился тем, почему он удаляет содержимое этого столбца. У других столбцов есть содержимое, которое он хранит. Так что не так с колонкой даты?

Существуют ли какие-либо настройки или свойства, которые могут вызвать или предотвратить сброс содержимого?

Даже если вы не понимаете, что не так, но у вас есть несколько советов о том, как это сделать.

1 ответ

Решение

Как упомянул @AlexeiLevenkov, вы должны выбрать другую строку, чем вы хотите. Вы упростили слишком много существенных проблем в попытке упростить, но все еще ясно, что не так...

Учтите, что ваш входной документ может выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<table>
  <tr class="calendar_row" data-eventid="12345">
    <td>This IS NOT the tr you're looking for</td>
  </tr>
  <tr class="calendar_row newday singleevent" data-eventid="42064">
    <td>This IS the tr you're looking for</td>
  </tr>
</table>

Тест @class="calendar_row" не будет совпадать с tr вы показываете, но это будет совпадать с первым рядом.

Вы можете изменить свой тест, чтобы быть contains(@class,'calendar_row') вместо этого, но это будет соответствовать обеим строкам. Вам нужно будет идентифицировать некоторый контент или атрибут, который уникален для нужной вам строки. Возможно, @data-eventid Атрибут будет работать - не могу сказать, не видя весь ваш входной файл.

Другие вопросы по тегам