Пожалуйста, помогите с кодом простого селектора Jsoup

Мне трудно получить нужную информацию из очень простого кода.

Например, у меня нет проблем со сбором данных в этом простом коде:

<HTML>
<TABLE>
<TABLE WIDTH=100%><TR class=FSS-data-row-highlight>
<TD>&nbsp;<A HREF="player.cgi?4686">Evgeni Malkin</A>, Pit (C/RW)</TD>
<TD class=FSS-data-right> 6 pts in last 2 GP&nbsp;</TD>
</TR>
</TABLE>
</TABLE>
</HTML>

Что мне нужно, так это строка «Евгений Малкин 6 pts in last 2», которая отлично работает в этом коде. Но при подключении ко всей странице ничего не возвращает. Я предполагаю, что это потому, что есть таблицы внутри таблиц, но я не могу понять, как действовать дальше. Вот мой код:

Document doc = Jsoup.connect("http://forecaster.thehockeynews.com/hockeynews/hockey/statistics.cgi?mlb&mode=hotnot/").get();
Elements scanYearplace = doc.select("tr.FSS-data-row-highlight td");
String yearplace = scanYearplace.text();

На самом деле мне нужно все, чтобы получить информацию обо всех других игроках, но это было бы началом, если бы я мог, чтобы этот работал.

Какие-либо предложения?

Заранее спасибо!


person user1139012    schedule 19.01.2012    source источник


Ответы (1)


--- см. обновление ниже ---

Пожалуйста, имейте в виду, что это уязвимость, поскольку любое изменение на сайте потенциально может сломать его. Вы также захотите проверить ошибки и еще много чего. Кроме того, я не видел текст «6 очков в последних 2 GP», как у вас выше, но вы можете получить любую статистику, которую хотите, используя этот код. Просто измените stats.get(4) на то, что хотите.

    Document doc = Jsoup.connect("http://forecaster.thehockeynews.com/hockeynews/hockey/statistics.cgi?mlb&mode=hotnot/").get();

    for (Element e : doc.select(".FSS-data-row")) {
        Element td = e.select("td.FSS-data-left > a").first();
        String name = (td != null?td.text():null);
        Elements stats = e.select(".FSS-data-right");
        String goals = (stats.size() > 0?stats.get(4).text():null);
        System.out.println(name + ":" + goals);
    }

Пример вывода:

null:null
J. Benn:13
P. Sharp:20
P. Marleau:17
T. Oshie:14

Первое значение null:null связано с тем, что оно похоже на строку заголовка на странице.


-----ОБНОВИТЬ-----

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

    Document doc = Jsoup.connect("http://forecaster.thehockeynews.com/hockeynews/hockey/statistics.cgi?&mode=hotnot").get();
    for (Element e : doc.select("tr.FSS-data-row-highlight")) {
        Element tdname = e.select("td > a").first();
        String name = (tdname != null?tdname.text():null);
        Element tdstat = e.select("td.FSS-data-right").first();
        String stat = tdstat.text();
        System.out.println(name + ":" + stat);
    }

Пример вывода:

Mathieu Perreault:5 pts in last 2 GP 
Mikhail Grabovski:5 pts in last 2 GP 
James Neal:4 pts in last 2 GP 
Kris Versteeg:4 pts in last 2 GP 
Evgeni Malkin:12 pts in last 6 GP 
person B. Anderson    schedule 31.01.2012