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
Атрибут будет работать - не могу сказать, не видя весь ваш входной файл.