2013-04-06 129 views
1

我怎样才能使用Jsoup从this website分别提取每行的规格数据,例如:网络 - >网络类型,电池等使用Jsoup提取和解析HTML表格

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

回答

2

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

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

@乔伊的代码试图在零上这些。您应该能够根据Xpath编写select()规则。

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

或者,您可以将HTML视为一个纯文本浏览器,并从文本中提取数据。这是页面的text version。您可以对文本进行分隔或在N个字符之后进行读取以提取数据。

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]
  • 第一过滤器前2点表中的行只包含标记进行格式化,所以跳过它们tr:gt(2)
  • 每隔一行与开始内容类型描述全球,过滤出来td:not([rowspan])

对于选择语法较为复杂的选项,看看这里http://jsoup.org/cookbook/extracting-data/selector-syntax

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