JSoup——用Java解析html网页内容
当需要从网页上获取信息时,需要解析html页面。筛选指定标签,并获取其值是必不可少的操作,解析html页面这方面的利器,Python有BeautifulSoup,Java一直没有好的工具,之前的HtmlParser非常难用,虽能解析,但不能过滤,只能从头到尾地遍历各个节点,非常不便,而Jsoup是甚至比BeautifulSoup更加方便的工具,Jsoup支持类似于CSS(或jquery)的选择器语法,来实现非常强大和灵活的查找功能。
下面说说其基本用法:
1)Jsoup.parse(html)//建立一个html文本指定的html文档,返回一个Document对象 2)Document.select(filter)//按照过滤器指定条件,筛选满足条件的所有元素(或称为标签),返回一个Elements对象,表示一组Element对象。 3)Elements.first()//返回Elements的第一个Element对象 4)Element.text()//获取一个标签首尾之间的内容,如
String html="<div>我是一个div</div>";
Document doc=Jsoup.parse(html);
doc.getElementsByTag("div").first().text();//输出"我是一个div" 5)Element.attr(attrname),获取标签某个属性的值,如
String html="<div>我是一个div</div>";
Document doc=Jsoup.parse(html);
doc.getElementsByTag("div").first().attr("class")的值为"divStyle"
给出一个综合示例:
public static HashMap<String, Object> getDetails(String html)
{
HashMap<String, Object> details = new HashMap<String, Object>();
//解析开始
Document doc = Jsoup.parse(html);
//获取形如<div class="result_info ...">something</div>的第一个div元素,class^=result_info表示class以result_info开头,^是正则表达式的开始
Element divAll = doc.select("div[class^=result_info]").first();
//System.out.println(divAll.text());
Element head = divAll.select("h3").first();//获取div中的h3标签
String tvname = head.select("a").attr("title").trim();//获取h3标签中a标签的title属性值
String year = "";
if (head.select("em").size() > 0)//假如h3标签中存在多个<em></em>标签
{
year = head.select("em").first().text().trim();//只要第一个<em>首尾之间的文本
}
String score = "";
Element scoreSection = divAll.select("p").first();
if (scoreSection != null)
{
Elements es = scoreSection.select("span");//选择span元素
int size = es.size();
for (int i = 0; i < size; i++)
{
Element e = es.get(i);
String content = e.text().trim();
content = content.replace("\u00A0", "");//替换 为空格
score += content;
}
}
HashMap<String, String> lstOtherInfo = new HashMap<String, String>();
Elements otherSections = divAll.select("div[class^=result_info_cont]");//获取满足class以result_info_cont开头的所有div元素
int size = otherSections.size();//获取满足条件的div元素的总数是多少
int infoCount = 0;
for (int i = 0; i < size && infoCount < 3; i++)
{
String value = "";
Element item = otherSections.get(i);//获取第i个元素
boolean keyflag = true;
String key = "";
for (int index = 0; index < item.children().size(); index++)//Element.children()用于获取元素的直接子元素
{
Element e = item.child(index);//获取第index个子元素
if (keyflag)
{
key = e.text().trim();
if (key == "简介")
break;
keyflag = false;
}
else
{
if (e.children().size() > 0)
{
for (int b = 0; b < e.children().size(); b++)
{
value += e.child(b).text().trim() + ",";
}
}
else
{
String contents = e.text().trim();
value += contents + ",";
}
}
}
value = value.replaceAll("[" + "," + "]$", "");
lstOtherInfo.put(key, value);
infoCount++;
}
details.put("tv", tvname);
details.put("year", year);
details.put("score", score);
details.put("otherInfo", lstOtherInfo);
return details;
}
参考链接:
http://jsoup.org/apidocs/
https://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/
http://www.open-open.com/jsoup/selector-syntax.htm
JSoup——用Java解析html网页内容的更多相关文章
- java爬取网页内容 简单例子(2)——附jsoup的select用法详解
[背景] 在上一篇博文java爬取网页内容 简单例子(1)——使用正则表达式 里面,介绍了如何使用正则表达式去解析网页的内容,虽然该正则表达式比较通用,但繁琐,代码量多,现实中想要想出一条简单的正则表 ...
- 使用Jsoup函数包抓取网页内容
之前写过一篇用Java抓取网页内容的文章,当时是用url.openStream()函数创建一个流,然后用BufferedReader把这个inputstream读取进来.抓取的结果是一整个字符串.如果 ...
- Jsoup -- 网络爬虫解析器
需要下载jsoup-1.8.1.jar包 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQue ...
- java解析xml的三种方法
java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
- Jsoup实现java模拟登陆
Jsoup实现java模拟登陆 2013-10-29 14:52:05| 分类: web开发|举报|字号 订阅 下载LOFTER我的照片书 | 1:如何获取cookies. 1.1 ...
- java 解析XML文档
Java 解析XML文档 一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优 ...
- Java 解析 XML
Java 解析 XML 标签: Java基础 XML解析技术有两种 DOM SAX DOM方式 根据XML的层级结构在内存中分配一个树形结构,把XML的标签,属性和文本等元素都封装成树的节点对象 优点 ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
随机推荐
- 开课选课系统APP基本功能实现
队员:031302511 031302505 效果图如下: 上述功能分析: 功能分析:我们考虑到手机自带的SQLite会被清理软件清理掉数据,这样就没有实际用处.所以我们就自己搭建服务器 ...
- Qt学习思考
对各个部件基本了解,初步理解GUI应用程序的创建 2D图形文字绘制,3D图形(openGL)等 模型/视图框架编程,处理复杂的数据 多媒体框架 数据库,xml,文件读写等 网络编程 做出比较美观的界面 ...
- asp.net 学习
1.维护数据库的完整性.一致性.你喜欢用触发器还是自写业务逻辑?为什么? 答:尽可能用约束(包括CHECK.主键.唯一键.外键.非空字段)实现,这种方式的效率最好:其次用触发器,这种方式可以保证无论何 ...
- 获取手机的gps定位
只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: - getCurr ...
- 【Matplotlib】绘图常见设置说明
说明:此贴会不定期进行更新! 设置1:图像的大小设置. 如果已经存在figure对象,可以通过以下代码设置尺寸大小: f.set_figheight(15) f.set_figwidth(15) 若果 ...
- 未完结第八节 JBPM流程节点
1.12个节点介绍 2.Node节点
- 11.Android之常用对话框AlertDialog学习
(1)首先我们写个简单的AlertDialog对话框,要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法,然后创建对话框可以设置对话框的属性,比如 ...
- BZOJ-1854 游戏 二分图匹配 (并查集)
1854: [Scoi2010]游戏 Time Limit: 5 Sec Memory Limit: 162 MB Submit: 3372 Solved: 1244 [Submit][Status] ...
- 蓝桥T291(BFS + 输出路径)
http://lx.lanqiao.org/problem.page?gpid=T291 学霸的迷宫 时间限制:1.0s 内存限制:256.0MB 问题描述 学霸抢走了大家的作业,班 ...
- 求一元二次方程ax^2+bx+c=0的解
Console.WriteLine("求解方程ax^2+bx+c=0的解."); Console.WriteLine("请分别输入a,b,c的值(注意每输入一个值按一下回 ...