【问题标题】:Extract and Parse HTML Table using Jsoup使用 Jsoup 提取和解析 HTML 表格
【发布时间】:2013-04-06 16:07:06
【问题描述】:

我如何使用 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());   
            }
        }
    }
}

【问题讨论】:

    标签: java html web-scraping jsoup


    【解决方案1】:

    这是为您的问题寻找解决方案的尝试

    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

    【讨论】:

      【解决方案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 个字符后提取数据。

      【讨论】:

        【解决方案3】:

        这就是我从 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";
                    }
        

        【讨论】:

          【解决方案4】:

          这是通过 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-01-01
            • 2019-10-10
            • 1970-01-01
            • 2015-08-17
            • 2018-09-04
            • 2015-10-14
            相关资源
            最近更新 更多