使用 Java jsoup 解析 html 页面并存储数据
Using Java jsoup to parse a html page and store data
我正在尝试使用 jsoup 库来解析一个 html 文件并获取与 table class="scl_list"
相关的所有数据,如下所示,这只是 html 页面的一小部分.
<table class="scl_list">
<tr>
<th align="center">Id:</th>
<th align="center">Name:</th>
<th align="center">Serial:</th>
<th align="center">Status:</th>
<th align="center">Ladestrom:</th>
<th align="center">Zähleradresse:</th>
<th align="center">Zählerstand:</th>
</tr>
<tr>
<th align="center">7</th>
<th align="center">7</th>
<th align="center">c3001c0020333347156a66</th>
<th align="center">Idle</th>
<th align="center">16.0</th>
<th align="center">40100021</th>
<th align="center">12464.25</th>
</tr>
<tr>
<th align="center">21</th>
<th align="center">21</th>
<th align="center">c3002a003c343551086869</th>
<th align="center">Idle</th>
<th align="center">16.0</th>
<th align="center">540100371</th>
<th align="center">1219.73</th>
</tr>
</table>
对于每个 <tr>
,然后我需要获取每个 <th>
并将数据保存在 table 或向量中。不幸的是,我找不到很多使用 jsoup 做类似事情的例子。
到目前为止我有这个,其中 html_string
是我的 html 页面,但我不确定如何进行。非常感谢任何帮助:
Document doc = Jsoup.parse(html_string);
Elements els = doc.getElementsContainingText("table class=\"scl_list\"");
Jsoup 是一个简单直观的库。您可以在网上找到许多如何阅读 html table 的示例。查看 jsoup cookbook and especially the selector-syntax 下的文档。回到你的问题,一个简单的方法如下:
public static void main(String[] args) {
String html = "<table class=\"scl_list\">\n" +
" <tr>\n" +
" <th align=\"center\">Id:</th>\n" +
" <th align=\"center\">Name:</th>\n" +
" <th align=\"center\">Serial:</th>\n" +
" <th align=\"center\">Status:</th>\n" +
" <th align=\"center\">Ladestrom:</th>\n" +
" <th align=\"center\">Zähleradresse:</th>\n" +
" <th align=\"center\">Zählerstand:</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <th align=\"center\">7</th>\n" +
" <th align=\"center\">7</th>\n" +
" <th align=\"center\">c3001c0020333347156a66</th>\n" +
" <th align=\"center\">Idle</th>\n" +
" <th align=\"center\">16.0</th>\n" +
" <th align=\"center\">40100021</th>\n" +
" <th align=\"center\">12464.25</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <th align=\"center\">21</th>\n" +
" <th align=\"center\">21</th>\n" +
" <th align=\"center\">c3002a003c343551086869</th>\n" +
" <th align=\"center\">Idle</th>\n" +
" <th align=\"center\">16.0</th>\n" +
" <th align=\"center\">540100371</th>\n" +
" <th align=\"center\">1219.73</th>\n" +
" </tr>\n" +
" </table>";
Document doc = Jsoup.parse(html);
Elements trs = doc.select("table.scl_list tr");
List<List<String>> data = new ArrayList<>();
for(Element tr : trs){
List<String> row = tr.select("th").stream().map(e -> e.text())
.collect(Collectors.toList());
data.add(row);
}
data.forEach(System.out::println);
}
输出应该是这样的:
[Id:, Name:, Serial:, Status:, Ladestrom:, Zähleradresse:, Zählerstand:]
[7, 7, c3001c0020333347156a66, Idle, 16.0, 40100021, 12464.25]
[21, 21, c3002a003c343551086869, Idle, 16.0, 540100371, 1219.73]
由于第一个元素似乎只包含 table 标题,您可以使用简单的 for 循环并从第二个元素开始跳过它。
因为我假设你的数据代表电表,我建议你实现一个小的 class 作为数据容器,它看起来像这样
class Meter{
int id;
String name;
String serial;
String status;
double chargingCurrent;
String address;
double meterReading;
public Meter(List<String> data) {
this.id = Integer.parseInt(data.get(0));
this.name = data.get(1);
this.serial = data.get(2);
this.status = data.get(3);
this.chargingCurrent = Double.parseDouble(data.get(4));
this.address = data.get(5);
this.meterReading = Double.parseDouble(data.get(6));
}
// getters & setters
}
上面的代码可以重写为:
Document doc = Jsoup.parse(html);
Elements trs = doc.select("table.scl_list tr");
List<Meter> meters = new ArrayList<>();
for(int i = 1; i< trs.size(); i++){
List<String> row = trs.get(i).select("th").stream().map(e -> e.text())
.collect(Collectors.toList());
meters.add(new Meter(row));
}
meters.forEach(System.out::println);
使用相应的 toString
方法,输出将如下所示:
Meter{id=7, name=7, serial=c3001c0020333347156a66, status=Idle, chargingCurrent=16.0, address=40100021, meterReading=12464.25}
Meter{id=21, name=21, serial=c3002a003c343551086869, status=Idle, chargingCurrent=16.0, address=540100371, meterReading=1219.73}
我正在尝试使用 jsoup 库来解析一个 html 文件并获取与 table class="scl_list"
相关的所有数据,如下所示,这只是 html 页面的一小部分.
<table class="scl_list">
<tr>
<th align="center">Id:</th>
<th align="center">Name:</th>
<th align="center">Serial:</th>
<th align="center">Status:</th>
<th align="center">Ladestrom:</th>
<th align="center">Zähleradresse:</th>
<th align="center">Zählerstand:</th>
</tr>
<tr>
<th align="center">7</th>
<th align="center">7</th>
<th align="center">c3001c0020333347156a66</th>
<th align="center">Idle</th>
<th align="center">16.0</th>
<th align="center">40100021</th>
<th align="center">12464.25</th>
</tr>
<tr>
<th align="center">21</th>
<th align="center">21</th>
<th align="center">c3002a003c343551086869</th>
<th align="center">Idle</th>
<th align="center">16.0</th>
<th align="center">540100371</th>
<th align="center">1219.73</th>
</tr>
</table>
对于每个 <tr>
,然后我需要获取每个 <th>
并将数据保存在 table 或向量中。不幸的是,我找不到很多使用 jsoup 做类似事情的例子。
到目前为止我有这个,其中 html_string
是我的 html 页面,但我不确定如何进行。非常感谢任何帮助:
Document doc = Jsoup.parse(html_string);
Elements els = doc.getElementsContainingText("table class=\"scl_list\"");
Jsoup 是一个简单直观的库。您可以在网上找到许多如何阅读 html table 的示例。查看 jsoup cookbook and especially the selector-syntax 下的文档。回到你的问题,一个简单的方法如下:
public static void main(String[] args) {
String html = "<table class=\"scl_list\">\n" +
" <tr>\n" +
" <th align=\"center\">Id:</th>\n" +
" <th align=\"center\">Name:</th>\n" +
" <th align=\"center\">Serial:</th>\n" +
" <th align=\"center\">Status:</th>\n" +
" <th align=\"center\">Ladestrom:</th>\n" +
" <th align=\"center\">Zähleradresse:</th>\n" +
" <th align=\"center\">Zählerstand:</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <th align=\"center\">7</th>\n" +
" <th align=\"center\">7</th>\n" +
" <th align=\"center\">c3001c0020333347156a66</th>\n" +
" <th align=\"center\">Idle</th>\n" +
" <th align=\"center\">16.0</th>\n" +
" <th align=\"center\">40100021</th>\n" +
" <th align=\"center\">12464.25</th>\n" +
" </tr>\n" +
" <tr>\n" +
" <th align=\"center\">21</th>\n" +
" <th align=\"center\">21</th>\n" +
" <th align=\"center\">c3002a003c343551086869</th>\n" +
" <th align=\"center\">Idle</th>\n" +
" <th align=\"center\">16.0</th>\n" +
" <th align=\"center\">540100371</th>\n" +
" <th align=\"center\">1219.73</th>\n" +
" </tr>\n" +
" </table>";
Document doc = Jsoup.parse(html);
Elements trs = doc.select("table.scl_list tr");
List<List<String>> data = new ArrayList<>();
for(Element tr : trs){
List<String> row = tr.select("th").stream().map(e -> e.text())
.collect(Collectors.toList());
data.add(row);
}
data.forEach(System.out::println);
}
输出应该是这样的:
[Id:, Name:, Serial:, Status:, Ladestrom:, Zähleradresse:, Zählerstand:]
[7, 7, c3001c0020333347156a66, Idle, 16.0, 40100021, 12464.25]
[21, 21, c3002a003c343551086869, Idle, 16.0, 540100371, 1219.73]
由于第一个元素似乎只包含 table 标题,您可以使用简单的 for 循环并从第二个元素开始跳过它。
因为我假设你的数据代表电表,我建议你实现一个小的 class 作为数据容器,它看起来像这样
class Meter{
int id;
String name;
String serial;
String status;
double chargingCurrent;
String address;
double meterReading;
public Meter(List<String> data) {
this.id = Integer.parseInt(data.get(0));
this.name = data.get(1);
this.serial = data.get(2);
this.status = data.get(3);
this.chargingCurrent = Double.parseDouble(data.get(4));
this.address = data.get(5);
this.meterReading = Double.parseDouble(data.get(6));
}
// getters & setters
}
上面的代码可以重写为:
Document doc = Jsoup.parse(html);
Elements trs = doc.select("table.scl_list tr");
List<Meter> meters = new ArrayList<>();
for(int i = 1; i< trs.size(); i++){
List<String> row = trs.get(i).select("th").stream().map(e -> e.text())
.collect(Collectors.toList());
meters.add(new Meter(row));
}
meters.forEach(System.out::println);
使用相应的 toString
方法,输出将如下所示:
Meter{id=7, name=7, serial=c3001c0020333347156a66, status=Idle, chargingCurrent=16.0, address=40100021, meterReading=12464.25}
Meter{id=21, name=21, serial=c3002a003c343551086869, status=Idle, chargingCurrent=16.0, address=540100371, meterReading=1219.73}