当前位置: 首页 > news >正文

jsoup解析本地html网页到本地2

  • 在之前的jsoup解析本地html网页到本地中,虽然可以实现不同食物的解析,但是每个食物单独写一个方法实在太麻烦了
  • 注意到所有食物均属于Food的子类,且解析方法中有许多重复代码
  • 可将Food food以及Element foodDiv这两个方法中重复的参数作为通用方法的参数,提取公用方法:
// 提取公共解析逻辑到独立方法private void parseCommonFields(Element foodDiv, Food food) {String imgUrl = Objects.requireNonNull(foodDiv.selectFirst("img")).attr("src");String name = Objects.requireNonNull(foodDiv.selectFirst("h2")).text();String weight = foodDiv.select("p:contains(Weight)").text().replace("Weight: ", "");String caloriesStr = foodDiv.select("p:contains(Calories)").text().replace("Calories: ", "").replace("kcal", "").trim();int calories = Integer.parseInt(caloriesStr);String priceStr = foodDiv.select("p.price").text().replace("$", "");double price = Double.parseDouble(priceStr);String features = foodDiv.select("p.features").text().replace("Features: ", "");food.setName(name);food.setWeight(weight);food.setCalories(calories);food.setPrice(price);food.setFeatures(features);food.setImgUrl(imgUrl);}

然后,每个食物只需要调用公共方法,并提取自己的特有部分即可:

  1. Pizzas:
public List<Pizza> parsePizzas(String filePath) {List<Pizza> pizzas = new ArrayList<>();try {Document doc = Jsoup.parse(new File(filePath), "UTF-8");Elements pizzaDivs = doc.select("div.pizza");for (Element pizzaDiv : pizzaDivs) {Pizza pizza = new Pizza();parseCommonFields(pizzaDiv, pizza); // 调用公共解析方法// 只处理Pizza特有的字段String radius = pizzaDiv.select("p:contains(Radius)").text().replace("Radius: ", "");pizza.setRadius(radius);pizzas.add(pizza);}} catch (Exception e) {System.out.println("解析Pizza数据失败" + e.getMessage());}return pizzas;}
  1. FrenchFries:
public List<FrenchFries> parseFrenchFriess(String filePath) {List<FrenchFries> frenchFriesList = new ArrayList<>();try {Document doc = Jsoup.parse(new File(filePath), "UTF-8");Elements friesDivs = doc.select("div.french-fries");for (Element friesDiv : friesDivs) {FrenchFries frenchFries = new FrenchFries();parseCommonFields(friesDiv, frenchFries); // 调用公共解析方法// 只处理FrenchFries特有的字段String thickness = friesDiv.select("p:contains(Thickness)").text().replace("Thickness: ", "");frenchFries.setThickness(thickness);frenchFriesList.add(frenchFries);}} catch (IOException e) {throw new RuntimeException(e);}return frenchFriesList;}
  1. FriedChicken:
public List<FriedChicken> parseFriedChickens(String filePath) {List<FriedChicken> friedChickenList = new ArrayList<>();try {Document doc = Jsoup.parse(new File(filePath), "UTF-8");Elements friedChickenDivs = doc.select("div.fried-chicken");for (Element friedChickenDiv : friedChickenDivs) {FriedChicken friedChicken = new FriedChicken();parseCommonFields(friedChickenDiv, friedChicken); // 调用公共解析方法// 只处理FriedChicken特有的字段String spiciness = friedChickenDiv.select("p:contains(Spiciness)").text().replace("Spiciness: ", "");friedChicken.setSpiciness(spiciness);friedChickenList.add(friedChicken);}} catch (IOException e) {throw new RuntimeException(e);}return friedChickenList;}
http://www.rkmt.cn/news/28231.html

相关文章:

  • 【转载】cap,pcap文件中的ipv4数据包转成ipv6数据包
  • QMPlay 编译
  • Linux 命令 - 教程
  • 详细介绍:如何实现多人协同文档编辑器
  • 高级语言设计第二次作业
  • prometheus服务的客户端
  • 2025 年北京品牌设计公司最新推荐榜,聚焦企业专业能力与服务价值深度剖析
  • 连续与间断
  • 记一次 .NET 某光放测试系统 崩溃分析
  • 基于DSP的伺服电机驱动器程序设计
  • cookie和缓存的区别
  • 【内网渗透】第168天:基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建
  • http明文容易暴露信息
  • AI Agent的未来之争:任务规划,该由人主导还是AI自主?——阿里云RDS AI助手的最佳实践
  • K8s配置的“双重人格”:一次hostPort神秘复现的排查之旅
  • 2025年10月又红又痒用什么产品推荐榜:权威对比五款修护精华
  • 反汇编
  • 2025年10月酵母品牌推荐榜:老面风味对比全评测
  • 测试效率卡点如何破?QA 双角色协作模式帮你提升效率和覆盖率
  • 嵌入式系统学习笔记
  • 限时优惠 | 性能测试进阶训练营重磅来袭
  • 2025年CNC机械加工厂家权威推荐榜:涵盖铣床/车床/磨削/多轴/复合加工,铝/不锈钢/钛合金/铜/模具钢/塑料件定制,专业承接汽车/医疗/航空航天/机器人/通讯设备零件及模具制造
  • 基于EEMD(集合经验模态分解)对故障信号进行分解
  • C# Web开发教程(八)中间件
  • 自我成长 - 木易
  • DeepSeek OCR:10倍文档压缩,97%准确率,让你的 LLM 读得更快、更省
  • 如果时间不够,无法进行充分的测试怎么办?
  • 批量跑脚本后自定义消息内容发送至钉钉--批量跑脚本
  • 有了 MCP,为啥 Claude 还要推出 Skills?一文带你搞懂它到底强在哪? MCP 有啥区别、该怎么用!
  • 香港高防服务器本地清洗与国际清洗的区别 - 实践