gpt4 book ai didi

java - 如何在Java中通过Web Scraping获取多个HTML表的数据

转载 作者:行者123 更新时间:2023-11-30 07:26:20 27 4
gpt4 key购买 nike

我试图抓取网站的数据,在某种程度上我成功地实现了我的目标。但是,有一个问题,我尝试抓取的网页中有多个 HTML 表。现在,当我执行程序时,它仅检索 CSV 文件中第一个表的数据,而不检索其他表。我的java类代码如下。

   public static void parsingHTML() throws Exception {
//tbodyElements = doc.getElementsByTag("tbody");
for (int i = 1; i <= 1; i++) {

Elements table = doc.getElementsByTag("table");

if (table.isEmpty()) {
throw new Exception("Table is not found");
}

elements = table.get(0).getElementsByTag("tr");

for (Element trElement : elements) {
trElement2 = trElement.getElementsByTag("tr");
tdElements = trElement.getElementsByTag("td");
File fold = new File("C:\\convertedCSV9.csv");
fold.delete();
File fnew = new File("C:\\convertedCSV9.csv");
FileWriter sb = new FileWriter(fnew, true);
//StringBuilder sb = new StringBuilder(" ");
//String y = "<tr>";

for (Iterator<Element> it = tdElements.iterator(); it.hasNext();) {

//Element tdElement1 = it.next();
//final String content2 = tdElement1.text();
if (it.hasNext()) {
sb.append("\r\n");

}
for (Iterator<Element> it2 = trElement2.iterator(); it.hasNext();) {
Element tdElement2 = it.next();
final String content = tdElement2.text();

//stringjoiner.add(content);
//sb.append(formatData(content));
if (it2.hasNext()) {

sb.append(formatData(content));
sb.append(" , ");

}
if (!it.hasNext()) {
String content1 = content.replaceAll(",$", " ");
sb.append(formatData(content1));
//it2.next();

}

}

System.out.println(sb.toString());
sb.flush();
sb.close();

}
System.out.println(sampleList.add(tdElements));

}
}
}

我分析的是有一个循环只检查tr tds。因此,在第一个表格之后,HTML 页面上有一个样式表。可能是由于样式表循环被破坏。我认为这就是它进入下一个表的原因。

P.S:这是我试图废弃的链接 http://www.mufap.com.pk/nav_returns_performance.php?tab=01

最佳答案

您在代码开头所做的操作将不起作用:

// loop just once, why
for (int i = 1; i <= 1; i++) {
Elements table = doc.getElementsByTag("table");

if (table.isEmpty()) {
throw new Exception("Table is not found");
}
elements = table.get(0).getElementsByTag("tr");

在这里,您只循环一次,读取所有 table 元素,然后处理您找到的 first 表的所有 tr 元素。因此,即使您循环多次,您也始终会处理第一个

您必须迭代所有table元素,例如

for(Element table : doc.getElementsByTag("table")) {
for (Element trElement : table.getElementsByTag("tr")) {
// process "td"s and so on
}
}

编辑 由于您在使用上面的代码时遇到问题,因此这里有一个更彻底的示例。请注意,我使用 Jsoup 来读取和解析 HTML(您没有指定您正在使用的内容)

Document doc = Jsoup
.connect("http://www.mufap.com.pk/nav_returns_performance.php?tab=01")
.get();

for (Element table : doc.getElementsByTag("table")) {
for (Element trElement : table.getElementsByTag("tr")) {
// skip header "tr"s and process only data "tr"s
if (trElement.hasClass("tab-data1")) {

StringJoiner tdj = new StringJoiner(",");
for (Element tdElement : trElement.getElementsByTag("td")) {
tdj.add(tdElement.text());
}

System.out.println(tdj);
}
}
}

这将连接并打印所有数据单元格(具有 tab-data1 类的单元格)。不过,您仍然需要修改它才能写入您的 CSV 文件。

注意:在我的测试中,此过程处理 21 个 table、243 个 tr 和 2634 个 td

关于java - 如何在Java中通过Web Scraping获取多个HTML表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36768338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com