尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Jsoup 1.15.3 实战:5步构建携程酒店城市信息静态页面抓取器
Jsoup 1.15.3 实战5步构建携程酒店城市信息静态页面抓取器在当今数据驱动的商业环境中网页数据抓取已成为获取市场洞察的重要手段。对于旅游行业从业者而言准确掌握酒店分布和城市信息是业务决策的基础。本文将手把手教你用Java生态中最受欢迎的HTML解析库Jsoup 1.15.3构建一个高效的携程酒店城市信息抓取工具。1. 环境准备与项目初始化首先确保你的开发环境满足以下条件JDK 1.8或更高版本Maven 3.6IntelliJ IDEA或Eclipse IDE创建Maven项目并添加Jsoup依赖dependency groupIdorg.jsoup/groupId artifactIdjsoup/artifactId version1.15.3/version /dependency建议项目采用标准目录结构/src /main /java /com /yourcompany /ctrip CtripHotelParser.java HotelCity.java /resources /html_samples hotels.ctrip.html提示实际开发中建议使用Log4j2或SLF4J记录日志方便调试和问题追踪2. HTML文件解析基础Jsoup提供了多种解析HTML的方式对于本地文件解析我们主要使用Jsoup.parse()方法。创建基础解析工具类import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.io.File; import java.io.IOException; public class CtripHotelParser { public Document parseLocalHtml(String filePath) throws IOException { File input new File(filePath); return Jsoup.parse(input, UTF-8, https://hotels.ctrip.com); } // 测试方法 public static void main(String[] args) { try { CtripHotelParser parser new CtripHotelParser(); Document doc parser.parseLocalHtml(src/main/resources/html_samples/hotels.ctrip.html); System.out.println(页面标题: doc.title()); } catch (IOException e) { e.printStackTrace(); } } }关键参数说明filePath: HTML文件本地路径UTF-8: 指定文件编码基础URI: 用于解析相对路径设为携程酒店域名3. CSS选择器精确定位数据携程酒店城市页面通常采用类似以下结构div classcity-list dl classlayoutfix dtA/dt dd a href/hotel/beijing1>public ListHotelCity extractCities(Document doc) { ListHotelCity cities new ArrayList(); Elements cityGroups doc.select(dl.layoutfix); for (Element group : cityGroups) { Elements links group.select(a[href]); for (Element link : links) { HotelCity city new HotelCity(); city.setCityName(link.text()); city.setUrl(link.attr(href)); city.setCityId(link.attr(data-id)); cities.add(city); } } return cities; }常用CSS选择器模式tag#id: 通过ID选择元素tag.class: 通过类名选择[attribute]: 通过属性选择parent child: 直接子元素选择4. 数据封装与清洗创建HotelCity实体类封装数据public class HotelCity { private String cityId; private String cityName; private String url; private String pinyin; // getters setters public String extractPinyinFromUrl() { // 从URL中提取拼音部分如/hotel/beijing1 - beijing if(url ! null url.split(/).length 2) { String pinyinPart url.split(/)[2]; return pinyinPart.replaceAll([^a-zA-Z], ); } return null; } }数据清洗关键点去除空白字符String.trim()正则表达式过滤replaceAll([^a-zA-Z], )URL补全处理public String getFullUrl() { if(url ! null !url.startsWith(http)) { return https://hotels.ctrip.com url; } return url; }5. 完整项目实现与优化整合各模块的完整实现public class CtripHotelCrawler { private static final Logger logger LoggerFactory.getLogger(CtripHotelCrawler.class); public ListHotelCity crawlCityData(String htmlFilePath) { try { // 1. 解析HTML Document doc new CtripHotelParser().parseLocalHtml(htmlFilePath); // 2. 提取数据 ListHotelCity cities new CityDataExtractor().extractCities(doc); // 3. 数据后处理 cities.forEach(city - { city.setPinyin(city.extractPinyinFromUrl()); city.setUrl(city.getFullUrl()); }); logger.info(成功抓取{}个城市数据, cities.size()); return cities; } catch (Exception e) { logger.error(抓取城市数据失败, e); return Collections.emptyList(); } } // 导出为CSV的实用方法 public void exportToCsv(ListHotelCity cities, String outputPath) { try (PrintWriter writer new PrintWriter(new File(outputPath))) { writer.println(城市ID,城市名称,拼音,URL); cities.forEach(city - writer.println( String.join(,, city.getCityId(), city.getCityName(), city.getPinyin(), city.getUrl() ) )); } catch (FileNotFoundException e) { logger.error(导出CSV失败, e); } } }性能优化建议使用连接池处理多个HTML文件采用并行流处理大数据量cities.parallelStream()添加缓存机制避免重复解析实际项目中我曾遇到城市数据分散在多个div块中的情况通过调整CSS选择器为div.city-list dl.layoutfix解决了定位不准的问题。对于动态加载的内容可以考虑结合Selenium等工具先获取完整HTML再解析。掌握这些技巧后你可以轻松扩展此项目来抓取酒店详情、用户评价等更多有价值的数据为业务决策提供数据支持。
RELATED

相关推荐

2026年6月GESP真题及题解(C++八级):堆石子

2026年6月GESP真题及题解(C++八级):堆石子

2026年6月GESP真题及题解(C八级):堆石子 题目描述 有 mmm 堆石子,编号为 1,2,⋯,m1, 2, \cdots, m1,2,⋯,m,其石子数量分别记为 a1,a2,⋯,ama_1, a_2, \cdots, a_ma1​,a2​,⋯,am​。 现在要求第 111 堆石子恰有 nn…

📅 2026/8/25 18:40:58
AI让模糊变高清!这款神器图片视频一键超分,老片也能变4K!

AI让模糊变高清!这款神器图片视频一键超分,老片也能变4K!

翻出十年前的老照片,模糊到看不清人脸?下载的经典电影只有720P,在大屏电视上马赛克满满?收藏的GIF表情包分辨率太低,发朋友圈都嫌糊?更崩溃的是,网上找到的"AI放大工具"要么收费昂贵&…

📅 2026/9/8 8:26:32
运放零偏伺服电路设计:从LTspice仿真到实际电路振荡的2个关键调试步骤

运放零偏伺服电路设计:从LTspice仿真到实际电路振荡的2个关键调试步骤

运放零偏伺服电路设计:从LTspice仿真到实际电路振荡的2个关键调试步骤 在模拟电路设计中,运放零偏伺服电路是一个既基础又关键的技术环节。许多工程师在LTspice仿真阶段能够获得理想结果,但一旦转移到实际PCB上,往往会遇到意想不到…

📅 2026/8/22 20:32:25
MORE NEWS

更多资讯

📰

Remotion 图片处理完全指南:从 `<Img>` 布局定位到 `getImageDimensions` 动态取图

Remotion 图片处理完全指南&#xff1a;从 <Img> 布局定位到 getImageDimensions 动态取图 【免费下载链接】remotion &#x1f3a5; Make videos programmatically with React 项目地址: https://gitcode.com/GitHub_Trending/re/remotion 本文围绕 Remotion 技能…

📰

Clawdbot深度拆解:AI代理、爬虫机器人还是自动化智能体?

最近后台好几个朋友留言&#xff0c;都在问同一个词&#xff1a;Clawdbot。说实话&#xff0c;我第一次拿到这个词的时候也愣了一下&#xff0c;因为市面上叫“XX bot”的产品太多了&#xff0c;有些是真有落地案例&#xff0c;有些还停在概念阶段。但把它当成一个商业和技术命…

📰

Impeccable colorize 指南:在单色界面上建立有层次的战略性配色系统

Impeccable colorize 指南&#xff1a;在单色界面上建立有层次的战略性配色系统 【免费下载链接】impeccable The design language that makes your AI harness better at design. 项目地址: https://gitcode.com/GitHub_Trending/im/impeccable 本文面向使用 Impeccabl…

📰

SLAM只会建图不会认物?机器人语义导航全链路拆解

前阵子有朋友问我一个问题&#xff1a;SLAM建图画得挺漂亮&#xff0c;机器人也能在地图里绕开障碍物走来走去&#xff0c;但你跟它说“去找那把红色的椅子”&#xff0c;它为什么一脸茫然&#xff1f;这个问题的答案其实不复杂——SLAM建的是几何地图&#xff0c;地图里只有“…

📰

基于GAN的图像修复实战:生成对抗网络原理与PyTorch实现

简介&#xff1a;基于Python编程语言实现深度生成对抗网络图像修复模型的完整工程项目&#xff0c;源码与项目文档齐备&#xff0c;主要面向毕业设计、课程设计与项目开发场景&#xff0c;也适合具备一定深度学习基础的学习者作为实践参考。压缩包共包含七个文件&#xff0c;其…

📰

Agent Skill评测实战:从“好不好用”到可量化指标

做了快两年Agent应用&#xff0c;我最大的感受是&#xff1a;写一个Skill不难&#xff0c;难的是判断这个Skill到底好不好用。很多时候我在一个项目里信心满满地写了好几个Skill&#xff0c;单独调用都很正常&#xff0c;可一旦放进Agent里组合使用&#xff0c;效果就跟拆盲盒一…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬