html分析器——jericho-html-3.3分解table
原部分来自Internet上的其他博客,只是因为很长一段时间。忘了谁是参考,这里说声抱歉。。
先贴一些html页:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=GBK">
<title>HTML Parser</title>
<meta name="generator" content="Namo WebEditor">
</head>
<body>
<table width=620 border=0 cellpadding=1 cellspacing=0 bgcolor=#0066cc>
<tr>
<td width=100%>
<table width=100% border=0 cellpadding=4 cellspacing=0 bgcolor=#D3E5FB>
<tr bgcolor=#D3E5FB>
<td width=20%><font size="2" face="Arial,Verdana"><b>想学习
Name</b></font><br>
</td>
<td width=13%><font size="2" face="Arial,Verdana"><b>Result</b></font><br>
</td>
<td width=8%><font size="2" face="Arial,Verdana"><b>Time</b></font><br>
</td>
<td width=59%><font size="2" face="Arial,Verdana"><b>Synopsis</b></font><br>
</td>
</tr>
<tr bgcolor=#eeeeee>
<td width=20%><font size="1" face="Arial,Verdana"><b>9</b>
想学习</font><br>
</td>
<td width=13%><font size="1" face="Arial,Verdana"><font
color=#ff0033>+FAIL</font> <a
href="v4_wireless_802.1x_full/cdrouter_dhcp_20.txt">想学习</a></font><br>
</td>
<td width=8%><font size="1" face="Arial,Verdana">12:31</font><br>
</td>
<td width=59%><font size="1" face="Arial,Verdana">想学习</font><br>
</td>
</tr>
<tr bgcolor=#ffffff>
<td width=20%><font size="1" face="Arial,Verdana"><b>1</b>
cdrouter_basic_1</font><br>
</td>
<td width=13%><font size="1" face="Arial,Verdana">Pass <a
href="v4_wireless_802.1x_full/cdrouter_basic_1.txt">想学习</a></font><br>
</td>
<td width=8%><font size="1" face="Arial,Verdana">00:00</font><br>
</td>
<td width=59%><font size="1" face="Arial,Verdana">想学习</font><br>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
对于这个页面来说我想取出全部的td里面的文字内容,该怎么办呢。假设用正則表達式,我还真是难以写出正确的,来解析出我所要的结果。
在网上搜索了一下jericho-html-3.3这个插件,用来解析table。的确非常方便。
代码例如以下:
package com.xxx.hbuassys.test; import java.net.URL;
import java.util.Iterator;
import java.util.List; import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Segment;
import net.htmlparser.jericho.Source; public class HtmlParser
{
public static void main(String[] args) throws Exception
{
String sourceUrlString="test.html"; if(sourceUrlString.indexOf(':') == -1)
sourceUrlString ="file:"+sourceUrlString;
Source source=new Source(new URL(sourceUrlString));
List Elements_TABLE=source.getAllElements(HTMLElementName.TABLE);
Elements_TABLE.remove(0);//因为table相互嵌套。我们须要的是第二个,所以删掉第一个
Iterator it_TABLE = Elements_TABLE.iterator();
while(it_TABLE.hasNext())
{
Element Element_TABLE = (Element)it_TABLE.next();
// System.out.println("**"+Element_TABLE.toString()+"\n**");
Segment getContent_TABLE = (Segment)Element_TABLE.getContent();
List Elements_TR = getContent_TABLE.getAllElements(HTMLElementName.TR);
Iterator it_TR = Elements_TR.iterator();
while(it_TR.hasNext())
{
Element Element_TR = (Element)it_TR.next();
Segment getContent_TR = (Segment)Element_TR.getContent();
List Elements_FONT = getContent_TR.getAllElements(HTMLElementName.FONT);
Iterator it_FONT = Elements_FONT.iterator();
int i = 1;
while(it_FONT.hasNext())
{
Element Element_FONT = (Element)it_FONT.next();
Segment getContent_FONT = (Segment)Element_FONT.getContent();
String a1 = getContent_FONT.toString();
System.out.println(i + " = " + Element_FONT.getContent().getTextExtractor().toString());
i++;
}
System.out.println();
}
}
}
}
结果:
1 = 想学习 Name
2 = Result
3 = Time
4 = Synopsis
1 = 9 想学习
2 = +FAIL 想学习
3 = +FAIL
4 = 12:31
5 = 想学习
1 = 1 cdrouter_basic_1
2 = Pass 想学习
3 = 00:00
4 = 想学习
大致的思路就是,先取出全部的table标签,然后对须要的table进行解析,取出里面的tr,在从tr里面取出td这样就能够得到我们须要的内容了。
假设仅仅讲到这,那么就跟网上其它人讲的没有什么差别了。
由于项目的须要,使用此插件发现了一个问题:
假设html页面的编码是UTF-8的格式,那么解析出来的内容就会是乱码。假设直接对这些乱码编码。採用new String(str.getBytes(),"GBK");等之类的操作都不能解决这个问题。本人亲自測试过。
比如html页面变为:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title>HTML Parser</title>
<meta name="generator" content="Namo WebEditor">
</head>
<body>
<table width=620 border=0 cellpadding=1 cellspacing=0 bgcolor=#0066cc>
<tr>
<td width=100%>
<table width=100% border=0 cellpadding=4 cellspacing=0 bgcolor=#D3E5FB>
<tr bgcolor=#D3E5FB>
<td width=20%><font size="2" face="Arial,Verdana"><b>想学习
Name</b></font><br>
</td>
<td width=13%><font size="2" face="Arial,Verdana"><b>Result</b></font><br>
</td>
<td width=8%><font size="2" face="Arial,Verdana"><b>Time</b></font><br>
</td>
<td width=59%><font size="2" face="Arial,Verdana"><b>Synopsis</b></font><br>
</td>
</tr>
<tr bgcolor=#eeeeee>
<td width=20%><font size="1" face="Arial,Verdana"><b>9</b>
想学习</font><br>
</td>
<td width=13%><font size="1" face="Arial,Verdana"><font
color=#ff0033>+FAIL</font> <a
href="v4_wireless_802.1x_full/cdrouter_dhcp_20.txt">想学习</a></font><br>
</td>
<td width=8%><font size="1" face="Arial,Verdana">12:31</font><br>
</td>
<td width=59%><font size="1" face="Arial,Verdana">想学习</font><br>
</td>
</tr>
<tr bgcolor=#ffffff>
<td width=20%><font size="1" face="Arial,Verdana"><b>1</b>
cdrouter_basic_1</font><br>
</td>
<td width=13%><font size="1" face="Arial,Verdana">Pass <a
href="v4_wireless_802.1x_full/cdrouter_basic_1.txt">想学习</a></font><br>
</td>
<td width=8%><font size="1" face="Arial,Verdana">00:00</font><br>
</td>
<td width=59%><font size="1" face="Arial,Verdana">想学习</font><br>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
得到的结果是:
1 = ???
? Name
2 = Result
3 = Time
4 = Synopsis
1 = 9 ???
?
2 = +FAIL ?
???
3 = +FAIL
4 = 12:31
5 = ?
?
??
1 = 1 cdrouter_basic_1
2 = Pass ??
??
3 = 00:00
4 = ?
?
??
採用的方法是:改变<meta http-equiv="content-type" content="text/html;charset=UTF-8">变为:<meta http-equiv="content-type" content="text/html;charset=GBK">
具体情况,參考代码例如以下:
package com.xxx.hbuassys.test; import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Iterator;
import java.util.List; import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.HTMLElementName;
import net.htmlparser.jericho.Segment;
import net.htmlparser.jericho.Source; public class HtmlParser
{
public static void main(String[] args) throws Exception
{
BufferedReader reader=new BufferedReader(new InputStreamReader(new FileInputStream(new File("test.html"))));
// BufferedReader reader=new BufferedReader(new FileReader(new File("test.html")));
StringBuilder sbf=new StringBuilder();
String str=null;
while((str=reader.readLine())!=null){
sbf.append(str).append("\n");
}
//解决中文乱码的方法
String html=sbf.toString().replace("<meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\">", "<meta http-equiv=\"content-type\" content=\"text/html;charset=GBK\">");
// System.out.println(html);
Source source=new Source(html);
List Elements_TABLE=source.getAllElements(HTMLElementName.TABLE);
Elements_TABLE.remove(0);//因为table相互嵌套,我们须要的是第二个,所以删掉第一个
Iterator it_TABLE = Elements_TABLE.iterator();
while(it_TABLE.hasNext())
{
Element Element_TABLE = (Element)it_TABLE.next();
// System.out.println("**"+Element_TABLE.toString()+"\n**");
Segment getContent_TABLE = (Segment)Element_TABLE.getContent();
List Elements_TR = getContent_TABLE.getAllElements(HTMLElementName.TR);
Iterator it_TR = Elements_TR.iterator();
while(it_TR.hasNext())
{
Element Element_TR = (Element)it_TR.next();
Segment getContent_TR = (Segment)Element_TR.getContent();
List Elements_FONT = getContent_TR.getAllElements(HTMLElementName.FONT);
Iterator it_FONT = Elements_FONT.iterator();
int i = 1;
while(it_FONT.hasNext())
{
Element Element_FONT = (Element)it_FONT.next();
Segment getContent_FONT = (Segment)Element_FONT.getContent();
String a1 = getContent_FONT.toString();
System.out.println(i + " = " + Element_FONT.getContent().getTextExtractor().toString());
i++;
}
System.out.println();
}
}
}
}
结果例如以下:
1 = 想学习 Name
2 = Result
3 = Time
4 = Synopsis
1 = 9 想学习
2 = +FAIL 想学习
3 = +FAIL
4 = 12:31
5 = 想学习
1 = 1 cdrouter_basic_1
2 = Pass 想学习
3 = 00:00
4 = 想学习
版权声明:本文博主原创文章,博客,未经同意不得转载。
html分析器——jericho-html-3.3分解table的更多相关文章
- 1.7.4 Query Syntax and Parsing
1. 查询语法和解析 这部分主要说明了如何指定被使用的查询解析器.同样描述了主查询解析器的支持的语法和功能.同时还描述了在特定环境下使用的其他查询解析器.这里有一些普通查询解析器都能使用的参数,将会在 ...
- Solr记录-solr基础内容
Solr架构(体系结构) 在本章中,我们将讨论Apache Solr的架构. 下图显示了Apache Solr的体系结构的框图. Solr架构 - 构件块以下是Apache Solr的主要构建块(组件 ...
- SQL Server中如何实现遍历表的记录
SQL Server遍历表一般都要用到游标,SQL Server中可以很容易的用游标实现循环,实现SQL Server遍历表中记录. 但游标在实际的开发中都不推荐使用. 我们知道还可以借助临时表或表变 ...
- 全文索引--自己定义chinese_lexer词典
本文来具体解释一下怎样自己定义chinese_lexer此法分析器的词典 初始化数据 create table test2 (str1 varchar2(2000),str2varchar2(2000 ...
- 《收获,不止SQL优化》读书笔记
整体性能分析 AWR.ASH.ADDM.AWRDD 整体分析调优工具 AWR:关注数据库的整体性能的报告: ASH:数据库中的等待事件与哪些SQL具体对应的报告: ADDM:oracle给出的一些建议 ...
- solr介绍
solr架构图: 以下是Apache Solr的主要构建块(组件) 请求处理程序 - 发送到Apache Solr的请求由这些请求处理程序处理.请求可以是查询请求或索引更新请求.根据这些请示的要求来选 ...
- 分解数据表(将一个datatable按数据量分隔成多个table)
/// <summary> /// 分解数据表 /// </summary> /// <param name="originalTab">需要分 ...
- 03.LoT.UI 前后台通用框架分解系列之——多样的表格
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...
- SQLite3源程序分析之分析器的生成
1.概述 Lemon是一个LALR(1)文法分析器生成工具,与bison和yacc类似,是一个可以独立于SQLite使用的开源的分析器生成工具.而且它使用与yacc(bison)不同的语法规则,可以减 ...
随机推荐
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(六) Security Application Block 开发人员经常编写需要安全功能的应用程序.这些应用程序 ...
- windows phone 墓碑化(9)
原文:windows phone 墓碑化(9) 几个术语的理解: 名称 说明 ; App ap = (App)Application.Current; // 构造函数 ...
- 杭州电 3711 Binary Number
Binary Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- GPS 偏移校正(WGS-84) 至(GCJ-02) java版本号以实现
public class EvilTransform { final static double pi = 3.14159265358979324; // // // a = 6378245.0, 1 ...
- lua简洁的功能(两)
Lua中的函数带有词法定界的第一类值. 第一类值: 在Lua中,函数和其它值(数值,字符串)一样,函数能够被存放在变量中,也存放在表中, 能够作为函数的參数,还能够作为函数的返回值. 词法定界:被嵌套 ...
- Android规范发展
一.Android 编码规范 1.java 代码中不出现中文.最多凝视中能够出现中文 2.局部变量命名.静态成员变量命名 仅仅能包括字母,单词首字母出第一个外,都为大写,其它字母都为小写 3.常量命名 ...
- 新书《iOS8 Swift编程指南》货架
颐和园的新书出版. 链接:http://www.amazon.cn/dp/B00YOQSYAO 这本书从去年开始7可能开始写.今年1完成这个月的第一稿,经过多次修改,今天,最后的正式出版,欢迎大家指正 ...
- Arduino 数码管LED驱动 数组法
上个样例讲到驱动LED数码管,採用一种最直接的方案,对每一个LED进行高低电平的控制,这种长处是每一个LED都是受控可检的,避免了因为短路造成的假象,但对于数字变化来说,写起来就很冗余,因此这次尝试用 ...
- Hdu-1565 电网接入(1) (国家压缩dp获得冠军
正方形格通路(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【OpenCV新手教程之十八】OpenCV仿射变换 & SURF特征点描写叙述合辑
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/33320997 作者:毛星云(浅墨) ...