使用Jsoup提取和解析HTML表

KNU*_*KNU 1 html java web-scraping jsoup

我如何使用Jsoup 分别从每个行提取本网站的规范数据,例如网络 - >网络类型,电池等.

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

public class mobilereviews {
    public static void main(String[] args) throws Exception {
        Document doc = Jsoup.connect("http://mobilereviews.net/details-for-Motorola%20L7.htm").get();
        for (Element table : doc.select("table")) {
            for (Element row : table.select("tr")) {
                Elements tds = row.select("td");
                System.out.println(tds.get(0).text());   
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*oey 5

这是尝试找到问题的解决方案

Document doc = Jsoup.connect("http://mobilereviews.net/details-for-Motorola%20L7.htm").get();

for (Element table : doc.select("table[id=phone_details]")) {
     for (Element row : table.select("tr:gt(2)")) {
        Elements tds = row.select("td:not([rowspan])");
        System.out.println(tds.get(0).text() + "->" + tds.get(1).text());
     }
}
Run Code Online (Sandbox Code Playgroud)

解析HTML非常棘手,如果HTML发生更改,您的代码也需要更改.

您需要首先研究HTML标记以提出解析规则.

  • HTML中有多个表,因此您首先要过滤正确的表 table[id=phone_details]
  • 前两个表行仅包含用于格式化的标记,因此请跳过它们 tr:gt(2)
  • 每隔一行都以内容类型的全局描述开头,将其过滤掉 td:not([rowspan])

有关选择器语法中更复杂的选项,请查看http://jsoup.org/cookbook/extracting-data/selector-syntax