項目需展示每日黃歷(公歷/農歷/干支/宜/忌),無現成接口,採用 HttpClient 抓取網頁 HTML,Jsoup 解析提取,封裝為工具類集成。
public class Almanac {
private String solar; // 2016年04月11日 星期一
private String lunar; // 猴年三月初五
private String chineseAra; // 丙申年 壬辰月 癸亥日
private String should; // 宜:求子 祈福...
private String avoid; // 忌:玉堂(黃道)危日,忌出行
// getter/setter/構造器省略
}
public class AlmanacUtil {
private static final String URL = "https://tools.2345.com/rili.htm";
public static Almanac getAlmanac() {
String html = pickData(URL);
return analyzeHTML(html);
}
// HttpClient 抓取
private static String pickData(String url) {
try (CloseableHttpClient client = HttpClients.createDefault()) {
HttpGet get = new HttpGet(url);
try (CloseableHttpResponse resp = client.execute(get)) {
HttpEntity entity = resp.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
}
} catch (IOException e) { e.printStackTrace(); return null; }
}
// Jsoup 解析
private static Almanac analyzeHTML(String html) {
Document doc = Jsoup.parse(html);
String solar = new SimpleDateFormat("yyyy年MM月dd日 EEEE").format(new Date());
String lunar = doc.getElementById("info_nong").child(0).html().substring(1,3) + doc.getElementById("info_nong").html().substring(11);
String ganzhi = doc.getElementById("info_chang").text();
String yi = getSuggestion(doc, "yi");
String ji = getSuggestion(doc, "ji");
return new Almanac(solar, lunar, ganzhi, yi, ji);
}
private static String getSuggestion(Document doc, String id) {
Element el = doc.getElementById(id);
return el.getElementsByTag("a").stream().map(Element::text).collect(Collectors.joining(" "));
}
}
public class Test {
public static void main(String[] args) {
Almanac a = AlmanacUtil.getAlmanac();
System.out.println("公歷:" + a.getSolar());
System.out.println("農歷:" + a.getLunar());
System.out.println("干支:" + a.getChineseAra());
System.out.println("宜:" + a.getShould());
System.out.println("忌:" + a.getAvoid());
}
}


Elements links = doc.select("a[href]"); // 所有帶 href 的 a
Elements pngs = doc.select("img[src$=.png]"); // src 以 .png 結尾的 img
Element head = doc.select("div.masthead").first(); // class=masthead 的 div
Elements results = doc.select("h3.r > a"); // h3.r 直接子元素 a