我的问题如下:我从一个网站获得了Jsoup的一些数据(Jsoup代码也来自这里)
public class Kereso {
public static void main(String[] args) throws IOException {
String html = "http://www.szerencsejatek.hu/xls/otos.html";
Document doc = Jsoup.connect(html).get();
Elements tableElements = doc.select("table");
Elements tableRowElements = tableElements.select(":not(thead) tr");
for (Element row : tableRowElements) {
Elements rowItems = row.select("td");
for (Element rowItem : rowItems) {
System.out.println(rowItem.text());
}
System.out.println();
}
}
}
我从网站获得的每一行都应该是一个对象,我想将所有这些对象存储在一个ArrayList中
这是对象的类及其所需的数据:
public class Huzas {
private String ev;
private String het;
private String huzasdatum;
private String otosDb;
private String otos;
private String negyesDb;
private String negyes;
private String harmasDb;
private String harmas;
private String kettesDb;
private String kettes;
private int szam1;
private int szam2;
private int szam3;
private int szam4;
private int szam5;
public Huzas(String ev, String het, String huzasdatum, String otosDb, String otos, String negyesDb, String negyes, String harmasDb, String harmas, String kettesDb, String kettes, int szam1, int szam2, int szam3, int szam4, int szam5) {
this.ev = ev;
this.het = het;
this.huzasdatum = huzasdatum;
this.otosDb = otosDb;
this.otos = otos;
this.negyesDb = negyesDb;
this.negyes = negyes;
this.harmasDb = harmasDb;
this.harmas = harmas;
this.kettesDb = kettesDb;
this.kettes = kettes;
this.szam1 = szam1;
this.szam2 = szam2;
this.szam3 = szam3;
this.szam4 = szam4;
this.szam5 = szam5;
}
是否可以以这种方式存储它们?如果是,当然如何?
答案 0 :(得分:0)
我从网站获得的每一行都应该是一个对象,我想将所有这些对象存储在ArrayList中。
要将列数据与Huzas
对象链接起来,您必须编写一个包装器。
如果我没有弄错的话,你正在迭代某个网站上的表格,所以你应该已经知道了列的排序。只需在迭代时捕获每个coloumn的值,并在遇到Huzas对象时设置它的值。
但首先我们需要一些列表,我们可以使用在每个DOM迭代上获得的值来映射列。
// The elements should be in order of the columns in the DOM
String[] columnsFromDOM = {"ev", "huzasdatum", "het" ..... }
现在
List<Huzas> listOfHuzas = new ArrayList<>();
for (Element row : tableRowElements) {
Map<String, String> columnToObjectMap = new HashMap<>();
Elements rowItems = row.select("td");
int index = 0;
for (Element rowItem : rowItems) {
// (key,value) => ("ev", value_from_dom )
columnToObjectMap.put(columnsFromDOM[index], rowItem.text());
indexx++;
}
// now columnToObjectMap contains your values along with the relavant keys
// So now catch each value and assign it to a Huzas object
String ev = columnToObjectMap.get("ev");
String kettes = columnToObjectMap.get("kettes");
......
Huzas huzas = new Huzas(ev, het, .....);
listofHuzas.add(huzas);
}
答案 1 :(得分:0)
由于该网站有一个简单的结构化html,你可以像这样做
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Kereso {
public static void main(String[] args) throws IOException {
String html = "http://www.szerencsejatek.hu/xls/otos.html";
List<Huzas> listOfHuzas = new ArrayList<Huzas>();
Document doc = Jsoup.connect(html).get();
Elements rows = doc.select("tr");
rows.remove(0); //Remove head row
for (Element row : rows) {
Elements children = row.children();
listOfHuzas.add(new Huzas(children.get(0).text(), // ev
children.get(1).text(), // het
children.get(2).text(), // huzasdatum
children.get(3).text(), // otosDb
children.get(4).text(), // otos
children.get(5).text(), // negyesDb
children.get(6).text(), // negyes
children.get(7).text(), // harmasDb
children.get(8).text(), // harmas
children.get(9).text(), // kettesDb
children.get(10).text(), // kettes
Integer.parseInt(children.get(11).text()), // szam1
Integer.parseInt(children.get(12).text()), // szam2
Integer.parseInt(children.get(13).text()), // szam3
Integer.parseInt(children.get(14).text()), // szam4
Integer.parseInt(children.get(15).text())) // szam5
);
}
System.out.println(listOfHuzas);
}
}
由于每一行都有16列,并且所有int字段都有值,因此我只是直接索引子元素以简化。您可以在此处添加更多长度检查或错误处理。