【问题标题】: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();
}
}
}