Jsoup - 在 Java 中解析来自 table 的数据
Jsoup - parsing data from table in Java
我正在尝试制作一个解析器以获取已出现的最新 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());
}
补充文字
您的问题与 Jsoup 无关。它提取的值与 table 单元格中的值完全相同,它不能再帮助你了。
您现在可以尝试使用子字符串删除不需要的文本,因此请替换行
System.out.println(td.text());
使用此代码:
String text = td.text();
if (text.contains("(")) {
text = text.substring(0, text.indexOf("(")-1);
}
System.out.println(text);
它将只保留 (
个字符之前的文本。
NullPointerException
您正在解析的页面包含许多 table。您执行 doc.select("tr")
,这意味着您的 trs
变量包含此页面上每个 table 的每个 tr
。当您的代码遇到第二个 table 且 header 行不包含任何 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>
解决方案是将选择限制为仅第一个 table,因此替换行:
Elements trs = doc.select("tr");
和
Element firstTable = doc.select("table").first();
Elements trs = firstTable.select("tr");
您需要使用 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
我正在尝试制作一个解析器以获取已出现的最新 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());
}
补充文字
您的问题与 Jsoup 无关。它提取的值与 table 单元格中的值完全相同,它不能再帮助你了。 您现在可以尝试使用子字符串删除不需要的文本,因此请替换行
System.out.println(td.text());
使用此代码:
String text = td.text();
if (text.contains("(")) {
text = text.substring(0, text.indexOf("(")-1);
}
System.out.println(text);
它将只保留 (
个字符之前的文本。
NullPointerException
您正在解析的页面包含许多 table。您执行 doc.select("tr")
,这意味着您的 trs
变量包含此页面上每个 table 的每个 tr
。当您的代码遇到第二个 table 且 header 行不包含任何 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>
解决方案是将选择限制为仅第一个 table,因此替换行:
Elements trs = doc.select("tr");
和
Element firstTable = doc.select("table").first();
Elements trs = firstTable.select("tr");
您需要使用 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