package sometry;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.FileInputStream;
import java.io.File;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.HasChildFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableHeader;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.TextExtractingVisitor;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
public class InitializeParser {
public static void main(String[] args) {
String szContent = openFile( "http://www.cb.cityu.edu.hk/is/people/academic/");
try{
/*
* 第一部分 介绍Parser类的初始化
*
org.htmlparser.Parser类用来解析HTML页面,共有以下几个构造函数:
public Parser ();
public Parser (Lexer lexer, ParserFeedback fb);
public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;
public Parser (String resource, ParserFeedback feedback) throws ParserException;
public Parser (String resource) throws ParserException;
public Parser (Lexer lexer);
public Parser (URLConnection connection) throws ParserException;
常用的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser
*/
/*-------第一种初始化方式 Parser.createParser(String html, String charset) --------------*/
// szContent="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\"><title>白泽居-www.baizeju.com</title></head><html xmlns=\"http://www.w3.org/1999/xhtml\"><body ><div id=\"top_main\"> <div id=\"logoindex\"> <!--这是注释--> 白泽居-www.baizeju.com<a href=\"http://www.baizeju.com\">白泽居-www.baizeju.com</a> </div> 白泽居-www.baizeju.com</div></body></html>";
// Parser parser = Parser.createParser(szContent, "GBK");
/*-------第二种初始化方式 -使用HttpURLConnection-------------*/
// Parser parser = new Parser( (HttpURLConnection) (new URL("http://www.cb.cityu.edu.hk/staff/issliao/")).openConnection() );
/*------第三种初始化方式(也是我比较倾向于使用的方式)------*/
Parser parser = new Parser();
parser.setURL("http://www.cb.cityu.edu.hk/staff/issliao/");
parser.setEncoding(parser.getEncoding());
/*第二部分
* 主要获得页面中的Node,进而得到Node中的内容
*
*
*Node中包含的方法有几类:
*对于树型结构进行遍历的函数,这些函数最容易理解:
*Node getParent ():取得父节点
*NodeList getChildren ():取得子节点的列表
*Node getFirstChild ():取得第一个子节点
*Node getLastChild ():取得最后一个子节点
*Node getPreviousSibling ():取得前一个兄弟
*Node getNextSibling ():取得下一个兄弟节点
*取得Node内容的函数:
*String getText ():取得标签上的文本 如<head id="1">MyPlace</head>其中的id="1"
*String toPlainTextString():取得标签标出来的content, 如MyPlace
*String toHtml () :取得HTML信息(原始HTML)
*String toHtml (boolean verbatim):取得HTML信息(原始HTML)
*String toString ():取得字符串信息(原始HTML)
*Page getPage ():取得这个Node对应的Page对象
*int getStartPosition ():取得这个Node在HTML页面中的起始位置
*int getEndPosition ():取得这个Node在HTML页面中的结束位置
* */
// for (NodeIterator i = parser.elements (); i.hasMoreNodes(); ) {
// Node node = i.nextNode();
// message("getText:"+node.getText());
// message("getPlainText:"+node.toPlainTextString());
// message("toHtml:"+node.toHtml());
// message("toHtml(true):"+node.toHtml(true));
// message("toHtml(false):"+node.toHtml(false));
// message("toString:"+node.toString());
// message("=================================================");
// }
/*
* 第三部分 介绍Parser来解析网页
*Node分成三类:
*RemarkNode:代表Html中的注释
*TagNode:标签节点,是种类最多的节点类型,上述Tag的具体节点类都是TagNode的实现。
*TextNode:文本节点
*
* */
/*------ 主要有两种方式到达想要的Node ------*/
/*------ 第一种 Filter -------
* 16个不同的Filter,也可以分为几类。
* 判断类Filter:
* TagNameFilter
* HasAttributeFilter
* HasChildFilter
* HasParentFilter
* HasSiblingFilter
* IsEqualFilter
* 逻辑运算Filter:
* AndFilter
* NotFilter
* OrFilter
* XorFilter
* 其他Filter:
* NodeClassFilter
* StringFilter
* LinkStringFilter
* LinkRegexFilter
* RegexFilter
* CssSelectorNodeFilter
* */
/*获得节点*/
// NodeList nodes = parser.parse(new TagNameFilter("DIV"));
//或者采用
// NodeFilter filter = new TagNameFilter ("DIV");
// NodeList nodes = parser.extractAllNodesThatMatch(filter);
/*测试HasChildFilter,返回有符合条件的子节点的节点,如下是返回有DIV节点的节点*/
// NodeFilter innerFilter = new TagNameFilter("DIV");
// NodeFilter filter = new HasChildFilter(innerFilter);
// NodeList nodes = parser.extractAllNodesThatMatch(filter);
/*测试HasAttributeFilter,把有相应属性的tag找出来*/
// NodeFilter filter = new HasAttributeFilter( "id","cityu-cb-staff-contact" );
// NodeList nodes = parser.extractAllNodesThatMatch(filter);
/*其他很多filter见http://blog.csdn.net/yanjun_xiaoli/article/details/4291865
* */
/*下面测试下更重要的AndFilter*/
// NodeFilter filterID = new HasAttributeFilter( "id" );
// NodeFilter filterChild = new HasChildFilter(innerFilter);
// NodeFilter filter = new AndFilter(filterID, filterChild);
// NodeList nodes = parser.extractAllNodesThatMatch(filter);
// for(int i=0; i<nodes.size();i++){//nodes.size()
// TagNode node = (TagNode)nodes.elementAt(i);
// System.out.println("name是:" + node.getAttribute("name"));//获取tag的属性信息
// message("getText:"+node.getText());
// message("toPlainTextString:"+ node.toPlainTextString());
// message("=================================================");
// }
/*下面是一个解析表格的例子*/
String html = "<table>"+
"<tbody>"+
"<tr>"+
"<th>Address:</th>"+
"<td>"+
"P7920, Academic 1<br>City University of Hong Kong"+
"</td>"+
"</tr>"+
"<tr>"+
"<th>Phone:</th>"+
"<td>+852 34427552</td>"+
"</tr>" +
"<tr>"+
"<th>Fax:</th>"+
"<td>+852 34420370</td>"+
"</tr>" +
"<tr>"+
"<th colspan=\"2\" style=\"white-space: nowrap;\">E-mail:</th>"+
"</tr>"+
"<tr>"+
"<td colspan=\"2\"><a href=\"mailto:issliao@cityu.edu.hk\">issliao@cityu.edu.hk</a></td>"+
"</tr>" +
"</tbody>"+
"</table>";
Parser parser1 = null;
NodeList tableList = null;
NodeFilter tableFilter = null;
parser1 = Parser.createParser(html, "GBK");
tableFilter = new NodeClassFilter(TableTag.class);
tableList = parser1.extractAllNodesThatMatch(tableFilter);
for (int i=0; i<tableList.size(); i++) {
TableTag table = (TableTag) tableList.elementAt(i);
//取得表中的行集
TableRow[] rows = table.getRows();
//遍历每行
for (int r=0; r<rows.length; r++) {
TableRow tr = rows[r];
//从而得到<th> tag
TableHeader[] headers = tr.getHeaders();
for (int j = 0; j < headers.length; j++) {
System.out.println("tag标签为:" + headers[j].getTagName());
System.out.println("标签的内容为:" + headers[j].getStringText());
}
//行中的列
TableColumn[] td = tr.getColumns();
for (int c=0; c<td.length; c++) {
System.out.print(td[c].toPlainTextString() + " ");
}
System.out.println();
}
}
}
catch( Exception e ) {
e.printStackTrace();
}
}
public static String openFile( String szFileName ) {
/*这个方法就是把整个网页内容读取下来*/
try {
URL url = new URL(szFileName);
BufferedReader bis = new BufferedReader(new InputStreamReader(url.openStream(), "GBK") );
String szContent="";
String szTemp;
while ( (szTemp = bis.readLine()) != null) {
szContent+=szTemp+"/n";
}
bis.close();
return szContent;
}
catch( Exception e ) {
return "";
}
}
private static void message( String szMsg ) {
try{
System.out.println(new String(szMsg.getBytes("GBK"), System.getProperty("file.encoding")));
} catch(Exception e ){}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)