是的,这是可能的,您所要做的就是重复调用select()
Document 对象上的方法,直到您枚举了所有选择器,然后调用该text()
方法。
您甚至可以将所有选择器合二为一,因为select(div[class=foo]).select(span[class=bar]).text()
相当于select(div[class=foo] span[class=bar]).text()
可以简化为select(div.foo span.bar).text()
因此,也许您甚至可以丢弃整个反射事物并动态创建正确且直接的选择器来满足您的需求。
Document doc = Jsoup.connect("http://test.com").get();
String companyName = doc.select("div.foo span.bar").text();
这是使用链接:
Document doc = Jsoup.connect("http://test.com").get();
List<String> criterias = Arrays.asList("div.foo", "span.bar");
Document tmpDoc = doc;
for (String criteria: criterias) {
if (tmpDoc != null)
tmpDoc = tmpDoc.select(criteria);
}
// now you have traversed the whole criterias just get the text
String companyName = tmpDoc.text();
否则,这与使用反射相同:
Document doc = Jsoup.connect("http://test.com").get();
List<String> criterias = Arrays.asList("div.foo", "span.bar");
Method select = doc.getClass().getMethod("select", String.class);
Document tmpDoc = doc;
for (String criteria: criterias) {
if (tmpDoc != null)
tmpDoc = (Document)select.invoke(tmpDoc, new Object[] {criteria});
}
// now you have traversed the whole criterias just get the text
String companyName = tmpDoc.text();