是的,它是可能的,您只需重複調用Document對象上的select()
方法,直到您枚舉了所有選擇器,並調用text()
方法。
你甚至可以Concat的所有選擇在一個因爲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();
我想你應該張貼for-each循環的代碼了,但沒有反射。你可以通過在'tmpDoc'上反覆調用'select'而不用反射來鏈接所有的選擇。反思在這裏肯定是錯誤的答案。 – DaoWen
是的,我知道,這就是我剛纔所說的,我發佈了反思代碼,所以他知道他如何處理它。謝謝。 – Alex
非常好!我同意發佈反射代碼是很好的,因爲他特別詢問了反射,但我很高興你發佈了非反射版本,所以他可以看到沒有更好的反射代碼。 – DaoWen