我想访问此网站上这个大表中的某些值:
http://www.hmdb.ca/metabolites/HMDB01448
例如,我想访问" Common Name" - > "硫酸盐"
我目前的解决方案是:
Document doc = Jsoup.parse(s);
Elements tables = doc.select("table.content-table.table.table-condensed.table-bordered");
for (Element table : tables) {
for (Element header : table.select("th")) {
Elements strong = header.select("strong");
System.out.println(strong.get(0).text());
}
}
}
出于某种原因,这不起作用。有什么想法吗?
提前谢谢!
编辑:我的问题与现有问题不同,因为我不知道要搜索的确切单元格,因为程序的不同迭代将产生不同的化学名称(不仅是硫酸盐)。
答案 0 :(得分:0)
您可以分两步访问所有行:
首先,您需要选择td
的所有行(它将过滤掉标题行)。这可以通过以下表达式完成:table.content-table > tbody > tr:has(td)
接下来,您需要遍历所有行并选择th
和td
。您可以使用th
方法从text()
提取文字,但在td
的情况下,我建议使用html()
方法提取值,因为它可能包含纯文本和一些HTML像列表等。
看一下这个例子:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.net.URI;
import java.net.URL;
final class JsoupTableReadExample {
public static void main(String[] args) throws IOException {
final URL url = URI.create("http://www.hmdb.ca/metabolites/HMDB01448").toURL();
final Document doc = Jsoup.parse(url, 4000);
final Elements rows = doc.select("table.content-table > tbody > tr:has(td)");
for (Element row : rows) {
String name = row.select("th").first().text();
String value = row.select("td").first().html();
System.out.println(name + " = " + value);
}
}
}
您可以使用它并找到最合适的解决方案来解决您的问题。我希望它有所帮助。