3

我如何使用 Jsoup 从该网站分别提取每一行的规格数据,例如 Network->Network Type、Battery 等。

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

4 回答 4

6

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

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]
  • 前 2 行仅包含用于格式化的标记,因此请跳过它们tr:gt(2)
  • 每隔一行以内容类型的全局描述开始,将其过滤掉td:not([rowspan])

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

于 2013-04-06T17:46:20.277 回答
3

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

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

@Joey 的代码试图将这些归零。您应该能够编写select()基于 Xpath 的规则。

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

或者,您可以通过纯文本浏览器传输 HTML 并从文本中提取数据。这是页面的文本版本。您可以分隔文本或在 N 个字符后读取以提取数据。

于 2013-04-06T18:05:11.110 回答
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";
            }
于 2013-11-05T03:20:02.097 回答
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();
        }
    }
}
于 2014-12-17T05:33:45.900 回答