使用Jsoup提取和解析HTML表

时间:2013-04-06 16:07:07

标签: java html web-scraping jsoup

我如何使用Jsoup分别从this website中为每一行提取规范数据,例如网络 - >网络类型,电池等。

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());   
            }
        }
    }
}

4 个答案:

答案 0 :(得分: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());
     }
}

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

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

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

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

答案 1 :(得分:2)

列的xpath - //*[@id="phone_details"]/tbody/tr[3]/td[2]/strong

值的xpath - //*[@id="phone_details"]/tbody/tr[3]/td[3]

@ Joey的代码尝试将这些内容归零。您应该能够根据Xpath编写select()规则。

用适当的值替换数字(tr [N] / td [N])。

或者,您可以将HTML思想管道化为仅文本浏览器并从文本中提取数据。这是页面的text version。您可以分隔文本或在N个字符后读取以提取数据。

答案 2 :(得分:1)

这就是我从html表中获取数据的方式。

org.jsoup.nodes.Element tablaRegistros = doc
                    .getElementById("tableId");
for (org.jsoup.nodes.Element row : tablaRegistros.select("tr")) {
                for (org.jsoup.nodes.Element column : row.select("td")) {
                    // Elements tds = row.select("td");
                    // cadena += tds.get(0).text() + "->" +
                    // tds.get(1).text()
                    // + " \n";
                    cadena += column.text() + ",";
                }
                cadena += "\n";
            }

答案 3 :(得分:1)

以下是通过JSoup从HTML页面中提取表格的通用解决方案。

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 ExtractTableDataUsingJSoup {

    public static void main(String[] args) {
        extractTableUsingJsoup("http://mobilereviews.net/details-for-Motorola%20L7.htm","phone_details");
    }

    public static void extractTableUsingJsoup(String url, String tableId){
        Document doc;
        try {
            // need http protocol
            doc = Jsoup.connect(url).get();

            //Set id of any table from any website and the below code will print the contents of the table.
            //Set the extracted data in appropriate data structures and use them for further processing
            Element table = doc.getElementById(tableId);

            Elements tds = table.getElementsByTag("td");

            //You can check for nesting of tds if such structure exists
            for (Element td : tds) {
                System.out.println("\n"+td.text());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}