Jsoup - парсинг данных из таблицы в Java - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь сделать парсер, чтобы получить последние версии SQL, которые появились (только версия сборки). Он получает сообщение об ошибке и дополнительный текст ему не нужен. Что я делаю не так?

Document doc = Jsoup.connect("https://buildnumbers.wordpress.com/sqlserver/").get();
Elements trs = doc.select("tr");

//remove header row
trs.remove(0);

for (Element tr : trs) {
            Elements tds = tr.getElementsByTag("td");
            Element td = tds.last();
            System.out.println(td.text());
}

enter image description here

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вам нужно использовать String :: substring , чтобы избавиться от (...) в конце каждого текста. Кроме того, вы пропустили проверку null везде в вашей программе.

Сделайте это следующим образом:

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Main {
    public static void main(String[] args) throws IOException {
        Document doc = Jsoup.connect("https://buildnumbers.wordpress.com/sqlserver/").get();
        Elements trs = doc.select("tr");

        // remove header row
        trs.remove(0);

        String text;
        int i;
        for (Element tr : trs) {
            Elements tds = tr.getElementsByTag("td");
            Element td;
            if (tds != null) {
                td = tds.last();
                if (td != null) {
                    text = td.text();
                    if (text != null) {
                        i = text.indexOf("(");
                        if (i != -1) {
                            System.out.println(text.substring(0, i).trim());
                        }
                    }
                }
            }
        }
    }
}

Вывод:

15.0.4013.40
14.0.3281.6
13.0.5698.0
...
...
...
SSMS 16.4
SSMS 16.3
0 голосов
/ 06 марта 2020

дополнительный текст

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

System.out.println(td.text());

на этот код:

String text = td.text();
if (text.contains("(")) {
    text = text.substring(0, text.indexOf("(")-1);
}
System.out.println(text);

Она сохранит только текст до ( символ.

NullPointerException

Страница, которую вы анализируете, содержит много таблиц. Вы выполняете doc.select("tr"), и это означает, что ваша переменная trs содержит все tr каждой таблицы на этой странице. Исключение возникает, когда ваш код встречает вторую таблицу со строкой заголовка, которая не содержит td, потому что она выглядит следующим образом:

<tr>
   <th style="padding:4px;background-color:#f0f0f0;width:10%;">SQL Server</th>
   <th style="padding:4px;background-color:#f0f0f0;width:10%;">Analysis Services</th>
   <th style="padding:4px;background-color:#f0f0f0;width:65%;">Description</th>
   <th style="padding:4px;background-color:#f0f0f0;width:15%;">Release Date</th>
</tr>

Решение состоит в том, чтобы ограничить выбор только первой таблицей, поэтому заменить строку:

Elements trs = doc.select("tr");

на

Element firstTable = doc.select("table").first();
Elements trs = firstTable.select("tr");
...