如何使用Jsoup提取气象网站指定CSS类内的日期文本?
问题原因
- CSS选择器语法错误:第二处
select方法中的选择器缺少结尾闭合的],会直接抛出选择器语法异常 - 逻辑冗余:已经通过
first()拿到了目标date date-2节点对象,不需要重复执行select选择该节点,直接调用text()即可获取节点内文本 - 选择器写法可优化:多类选择器推荐使用
.date.date-2写法,比全匹配class属性的写法兼容性更强,避免节点新增其他类时匹配失败 - 缺少非空校验:如果页面结构变动匹配不到节点,
first()返回null会触发空指针异常 - 若需将
Tue, Oct 12格式转为10月12日,还需要额外做日期格式转换处理
修正后代码
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import java.io.IOException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Locale; public class Pars { private static Document getPage() throws IOException { String url = "https://www.gismeteo.by/weather-mogilev-4251/3-day/"; // 模拟浏览器请求头,避免被反爬拦截 Document page = Jsoup.connect(url) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") .timeout(3000) .get(); return page; } public static void main(String[] args) throws IOException { Document page = getPage(); // 优化选择器写法,增加非空判断 Element nameday = page.select("div.date.date-2").first(); if (nameday == null) { System.out.println("未匹配到目标日期节点"); return; } // 直接获取节点文本 String originDateStr = nameday.text(); System.out.println("原始日期字符串:" + originDateStr); // 日期格式转换:将英文日期转为「X月X日」格式 DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("EEE, MMM d", Locale.ENGLISH); LocalDate date = LocalDate.parse(originDateStr, inputFormatter); DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("M月d日"); String cnDateStr = outputFormatter.format(date); System.out.println("转换后中文日期:" + cnDateStr); } }
注意事项
- 如果请求被反爬返回403,可调整
userAgent参数,或补充cookie、代理等配置 - 如果页面返回的日期包含年份,需要对应调整日期格式化字符串的规则
内容的提问来源于stack exchange,提问作者Sergant
相关产品推荐
相关产品推荐

