はい、可能です。select()
すべてのセレクターを列挙し、メソッドを呼び出すまで、Document オブジェクトのメソッドを繰り返し呼び出すだけですtext()
。
すべてのセレクターを 1 つに連結することも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();