网页信息抓取利器HTMLParser的使用

论坛 期权论坛     
选择匿名的用户   2021-5-30 02:50   111   0
<p style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)">声明:转载自http://www.cnblogs.com/loveyakamoz/archive/2011/07/27/2118937.html</span></p>
<p style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)">HTMLParser</span>具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索。对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用,基本你的各种需求都可以满足。<br>     这里我根据自己这几个月来的经验,写了一点入门的东西,希望能对新学习HTMLParser的朋友们有所帮助。(不过当年高考本人语文只比及格高一分,所以文法方面的问题还希望大家多多担待)<br>     <br>     HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:<br>     public Parser ();<br>     public Parser (Lexer lexer, ParserFeedback fb);<br>    public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;<br>     public Parser (String resource, ParserFeedback feedback) throws ParserException;<br>    public Parser (String resource) throws ParserException;<br>     public Parser (Lexer lexer);<br>     public Parser (URLConnection connection) throws ParserException;<br>     和一个静态类public static Parser createParser (String html, String charset);<br> <br>     对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。<br>     这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。对于大多数中文页面来说,好像这是应该用得比较多的一个方法。<br> <br>    下面是初始化Parser的例子。</p>
<p style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)"><br> package com.baizeju.htmlparsertester;</span><br> import java.io.BufferedReader;<br> import java.io.InputStreamReader;<br> import java.io.FileInputStream;<br> import java.io.File;<br> import java.net.HttpURLConnection;<br> import java.net.URL;<br> <br> import org.htmlparser.visitors.TextExtractingVisitor;<br> <br> import org.htmlparser.Parser;<br> <br> /**<br> * &#64;author www.baizeju.com<br> */<br> public class Main {<!-- --><br>     private static String ENCODE &#61; &#34;GBK&#34;;<br>     private static void message( String szMsg ) {<!-- --><br>         try{System.out.println(new String(szMsg.getBytes(ENCODE), System.getProperty(&#34;file.encoding&#34;))); } catch(Exception e ){}<br>     }<br>     public static String openFile( String szFileName ) {<!-- --><br>         try {<!-- --><br>             BufferedReader bis &#61; new BufferedReader(new InputStreamReader(new FileInputStream( new File(szFileName)), ENCODE) );<br>             String szContent&#61;&#34;&#34;;<br>             String szTemp;<br>             <br>             while ( (szTemp &#61; bis.readLine()) !&#61; null) {<!-- --><br>                 szContent&#43;&#61;szTemp&#43;&#34;\n&#34;;<br>             }<br>             bis.close();<br>             return szContent;<br>         }<br>         catch( Exception e ) {<!-- --><br>             return &#34;&#34;;<br>         }<br>     }<br>     <br>    public static void main(String[] args) {<!-- --><br>         <br>         String szContent &#61; openFile( &#34;E:/My Sites/HTMLParserTester.html&#34;);<br>         <br>         try{<!-- --><br>            <strong> //Parser parser &#61; Parser.createParser(szContent, ENCODE);<br>             //Parser parser &#61; new Parser( szContent );<br>           </strong> Parser parser &#61; new Parser( (HttpURLConnection) (new URL(&#34;http://127.0.0.1:8080/HTMLParserTester.html&#34;)).openConnection() );<br>         <br>             TextExtractingVisitor visitor &#61; new TextExtractingVisitor();<br>             parser.visitAllNodesWith(visitor);<br>             String textInPage &#61; visitor.getExtractedText();<br> <br>             message(textInPage);<br>         }<br>         catch( Exception e ) {            <br>         }<br>     }<br> }<br> 加重的部分测试了几种不同的初始化方法,后面的显示了结果。大家看到能Parser出内容就可以了,如何操作访问Parser的内容我们在后面讨论。</p>
<p align="left" style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)">HTMLParser</span>将解析过的信息保存为一个树的结构。Node是信息保存的数据类型基础。<br> 请看Node的定义:<br> public interface Node extends Cloneable;<br> <br> <strong>Node中包含的方法有几类:<br> 对于树型结构进行遍历的函数,这些函数最容易理解:</strong><br> Node getParent ():取得父节点<br> NodeList getChildren ():取得子节点的列表<br> Node getFirstChild ():取得第一个子节点<br> Node getLastChild ():取得最后一个子
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP