package com.siqi.samples; import com.siqi.htmlparser.HtmlParser; import com.siqi.htmlparser.Tag; import com.siqi.htmlparser.WebUtils; public class TestWebPage { public static void main(String... args) { try { //获取网页 WebUtils webUtil = new WebUtils(); webUtil.processUrl("http://www.baidu.com/more/"); //解析网页 HtmlParser parser = new HtmlParser(webUtil.getWebContent(),webUtil.getCharset()); parser.parse(); //打印网页标签路径为"html/body/div/div/div/div/h3"的内容 String values = ""; for(String str : parser.getTagValues("html/body/div/div/div/div/h3")) { values = values + str + " "; } System.out.println(values); } catch (Exception e) { e.printStackTrace(); } } }结果:
新上线新! 搜索服务 导航服务 社区服务 游戏娱乐 移动服务 站长与开发者服务 软件工具 其他服务
代码:
package com.siqi.samples; import com.siqi.htmlparser.HtmlParser; import com.siqi.htmlparser.Tag; import com.siqi.htmlparser.WebUtils; public class TestWebPage { public static void main(String... args) { try { //获取网页 WebUtils webUtil = new WebUtils(); webUtil.processUrl("http://www.baidu.com/more/"); //解析网页 HtmlParser parser = new HtmlParser(webUtil.getWebContent(),webUtil.getCharset()); parser.parse(); //打印网页标签路径为"html/body/div/div/div/div/div/div/a"的内容 String values = ""; for(String str : parser.getTagValues("html/body/div/div/div/div/div/div/a")) { values = values + str + " "; } System.out.println(values); } catch (Exception e) { e.printStackTrace(); } } }
结果:
百度认证 百度壁纸 百度桌面 百度魔图 百度一键Root 网页 视频 音乐 地图 新闻 图片 词典 常用搜索 hao123 网站导航 百度团购 文库 空间 百科 贴吧 知道 搜藏 经验 百度阅读 百度身边 百度旅游 百度新知 百度相册 百度校园 百度游戏 百度应用 悠洋游戏 移动搜索 掌上百度 手机输入法 百度搜索 百度手机浏览器 百度移动应用 百度手机地图 百度云智能终端平台 百度通讯录 百度网盘 搜索开放平台 站长平台 百度统计 百度联盟 百度推广 广告管家 数据研究中心 风云榜 百度指数 百度分享 百度开发者中心 百度移动统计 百度浏览器 百度影音 百度hi 百度工具栏 百度阅读器 百度输入法 千千静听 百度翻译 百度寻人 百度公益 百度基金会 盲道 老年搜索 专利搜索 百付宝 百度营销大学 天空软件 百度房产
写这个包主要是想写一个天气预报的程序,主要通过抓取中国天气预报网http://www.weather.com.cn/weather/101010100.shtml网页上的内容,但是在获取网页的内容后,从代码中找到我想要的内容很麻烦。刚开始想用xml的解析器,比如dom4j,但是很多网页的标签都不是标准的xhtml,有些标签关闭,有些标签没有关闭,导致解析不正常。所以只能自己写个解析器。为了能够快速的解析出我想要的内容:比如 天气,日期,温度,生活指数等等。我将每个标签Tag都设置了一个标签路径tagPath。
什么是tagPath呢?
对于一个简单的网页:<html> <title>This is a title</title> <body>This is body</body> </html>
标题title的tagPath为 "html/title",
正文body的tagPath为 "html/body"
整篇网页的tagPath为 "html"。
在想获取标题的值的时候,只需要调用getTagValue("html/title"); 这样,无疑会使程序简单很多。
所以我写了一个简单的htmlparser包,通过这个包能很快的解析出网页内容。就向上面演示的代码一样。
例如我们想获取http://www.weather.com.cn/weather/101010100.shtml 上的天气预报,日期,温度,风向等
1.首先打印所有标签的tagPath
package com.siqi.samples; import com.siqi.htmlparser.HtmlParser; import com.siqi.htmlparser.Tag; import com.siqi.htmlparser.WebUtils; public class TestWebPage { public static void main(String... args) { try { //获取网页 WebUtils webUtil = new WebUtils(); webUtil.processUrl("http://www.weather.com.cn/weather/101010100.shtml"); //解析网页 HtmlParser parser = new HtmlParser(webUtil.getWebContent(),webUtil.getCharset()); parser.parse(); //如果浏览所有标签的path和attribute for(Tag tag : parser.getTags()) { System.out.println(tag); } } catch (Exception e) { e.printStackTrace(); } } }
...... Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue=12日星期六, class=cyclePrediction, title=农历十二月初一(三九第五天)] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=a, tagValue=] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=td, tagValue= ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=td, tagValue=夜间, width=12%, style=background:#f4f7fc;] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=td, tagValue= ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=td, tagValue= , width=10%] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue= , href=http://www.weather.com.cn/static/html/legend.shtml, target=_blank] Tag [tagType=SelfCTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a/img, tagName=img, tagValue= , src=/m2/i/icon_weather/29x20/n01.gif] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=a, tagValue= ] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=td, tagValue= ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=td, tagValue=, width=18%] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue=多云转晴, target=_blank] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=a, tagValue=] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=td, tagValue= ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=td, tagValue= , width=15%] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue= , href=http://baike.weather.com.cn/index.php?doc-view-1148.php, target=_blank] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a/span, tagName=span, tagValue=低温 ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a/span/strong, tagName=strong, tagValue=-7℃] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a/span, tagName=strong, tagValue=] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=span, tagValue= ] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=a, tagValue= ] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=td, tagValue= ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=td, tagValue= , width=15%] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue= 无持续风向 , href=http://baike.weather.com.cn/index.php?doc-view-778.php, target=_blank] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=a, tagValue= ] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=td, tagValue= ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=td, tagValue= , width=15%] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue= 微风 , href=http://baike.weather.com.cn/index.php?doc-view-778.php, target=_blank] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=a, tagValue= ] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=td, tagValue= ] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div/table, tagName=tr, tagValue= ] Tag [tagType=CloseTag, tagPath=html/body/input/div/div/div/div/div, tagName=table, tagValue= ] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table, tagName=table, tagValue= , class=yuBaoTable, width=100%, border=0, cellspacing=0, cellpadding=0] Tag [tagType=StartTag, tagPath=html/body/input/div/div/div/div/div/table/tr, tagName=tr, tagValue= ] ......前后省略了其他内容。
对于上面显示的tag,我们感兴趣的内容是:
tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue=12日星期六
tagPath=html/body/input/div/div/div/div/div/table/tr/td, tagName=td, tagValue=夜间
tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue=多云转晴
tagPath=html/body/input/div/div/div/div/div/table/tr/td/a/span, tagName=span, tagValue=低温
tagPath=html/body/input/div/div/div/div/div/table/tr/td/a/span/strong, tagName=strong, tagValue=-7℃
tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue= 无持续风向
tagPath=html/body/input/div/div/div/div/div/table/tr/td/a, tagName=a, tagValue= 微风所以,要获取这些值的话,我们需要获取调用他们共有的tagPath
html/body/input/div/div/div/div/div/table/tr/td/代码:
package com.siqi.samples; import com.siqi.simplehtmlparser.HtmlParser; import com.siqi.simplehtmlparser.Tag; import com.siqi.simplehtmlparser.WebUtils; public class TestWebPage { public static void main(String... args) { try { WebUtils webUtil = new WebUtils(); webUtil.processUrl("http://www.weather.com.cn/weather/101010100.shtml"); //System.out.println(webUtil.getWebContent()); HtmlParser parser = new HtmlParser(webUtil.getWebContent(),webUtil.getCharset()); parser.parse(); for(String str : parser.getTagValues("html/body/input/div/div/div/div/div/table/tr/td")) { System.out.println(str); } } catch (Exception e) { e.printStackTrace(); } } }结果:
12日星期六 夜间 多云转晴 低温-7℃ 无持续风向 微风 13日星期日 白天 晴 高温3℃ 无持续风向 微风 夜间 晴 低温-6℃ 无持续风向 微风 14日星期一 白天 阴 高温4℃ 无持续风向 微风 夜间 阴 低温-4℃ 无持续风向 微风 15日星期二 白天 阴 高温6℃ 北风 3-4级 夜间 晴 低温-6℃ 无持续风向 微风 16日星期三 白天 晴 高温5℃ 无持续风向 微风 夜间 晴 低温-8℃ 无持续风向 微风 17日星期四 白天 晴 高温5℃ 无持续风向 微风 夜间 晴 低温-7℃ 无持续风向 微风 18日星期五 白天 晴 高温6℃ 无持续风向 微风
本文中htmlparser的源码和使用例子:
http://download.csdn.net/detail/wssiqi/4985998