Я смог успешно использовать JSoup для синтаксического анализа всей страницы, однако я столкнулся с некоторой проблемой для анализа первого <td>
и в первом и последнем <tr>
таблицы. Особенно видно, как количество строк таблицы изменяется в течение всей продолжительности дня.
До сих пор я понимаю, что мне нужно получить таблицу на странице, поэтому я использую этот doc.select("table.tabular zebra").toString();
(хотя я не знаю, как иметь дело с пространством в классе таблицы, но это отдельная проблема).
Ниже приведен пример таблицы:
<table id="tradesTableE_PPT_L0" class="tabular zebra" style="float:left; margin-right:10px">
<caption>Latest trades</caption>
<thead>
<tr>
<th id="tradeTime" title="The time the trade was published">Time</th>
<th id="tradePrice" title="The trade price">Price</th>
<th id="tradeVolume" title="Number of shares traded">Volume</th>
<th id="tradeTotalPrice" title="Total value of bargain">Value</th>
<th id="bidPrice" title="Best bid at time of trade">Bid</th>
<th id="askPrice" title="Best ask at time of trade">Ask</th>
<th id="tradeType" title="Buy/Sell indicator"><a href="#types" style="color=#0000CC">B/S</a></th>
</tr>
</thead>
<tbody>
<tr align="right">
<th>16:22:40</th>
<td>204p</td>
<td>2,500</td>
<td>£5,100</td>
<td>192.5p</td>
<td>192.5p</td>
<td align="center" style='color:blue;'>Buy</td>
</tr>
<tr align="right">
<th>16:05:23</th>
<td>200p</td>
<td>2,500</td>
<td>£5,000</td>
<td>192.5p</td>
<td>192.5p</td>
<td align="center" style='color:blue;'>Buy</td>
</tr>
<tr align="right">
<th>15:59:51</th>
<td>197p</td>
<td>1,000</td>
<td>£1,970</td>
<td>192.5p</td>
<td>192.5p</td>
<td align="center" style='color:blue;'>Buy</td>
</tr>
</tbody>
</table>
Я получил ответ:
Для первой строки:
doc.select("[id^=tradesTableE_]").select("tr").get(1).select("td").get(0).text().toString();
и для последней строки:
doc.select("[id^=tradesTableE_]").select("tr").last().select("td").get(0).text().toString();
Доступ к элементам таблицы может стать очень грязным. Раньше мне приходилось использовать селен для проверки значений в таблице. Я обнаружил, что синтаксический анализ всей таблицы HTML в объект, поддерживающий разработчика, помог мне существенно упростить код. Без этого в коде было много беспорядочных селекторов xpath, из-за которых было трудно читать/поддерживать.
например:
TableWithHeaders table = MyHtmlUtils.parseTableWithHeaders(dom, "//[id=tradesTableE_PPT_L0]");
assertEquals(3, table.getRowCount());
assertEquals("204p", table.getCellText("Price", 0));
assertEquals("1,000", table.getCellText("Volume", 2));
public interface TableWithHeaders {
int getRowCount();
Collection<String> getHeaderNames();
String getCellText(String header, int row);
Element getCell(String header, int row);
...
}
table.tabular.zebra
- это то, что вы будете использовать. В именах классов нет пробелов, элемент может иметь более одного класса, разделенных пробелами.Tabular Zebra
на самом деле два класса. Не один с пробелом?