入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

实现从网页上抓取数据(htmlparser)

创建时间:2016-02-19 投稿人: 浏览次数:3438

package parser;

 

package parser;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

 

/**

 * 基本能实现网页抓取,不过要手动输入URL 将整个html内容保存到指定文件

 *

 * @author chenguoyong

 *

 */

public class ScrubSelectedWeb {

       private final static String CRLF = System.getProperty("line.separator");

 

       /**

       * @param args

       */

       public static void main(String[] args) {

              try {

                     URL ur = new URL("http://10.249.187.199:8083/injs100/");

                     InputStream instr = ur.openStream();

                     String s, str;

                     BufferedReader in = new BufferedReader(new InputStreamReader(instr));

                     StringBuffer sb = new StringBuffer();

                     BufferedWriter out = new BufferedWriter(new FileWriter(

                                   "D:/outPut.txt"));

                     while ((s = in.readLine()) != null) {

                            sb.append(s + CRLF);

                     }

                     System.out.println(sb);

                     str = new String(sb);

                     out.write(str);

                     out.close();

                     in.close();

              } catch (MalformedURLException e) {

                     e.printStackTrace();

              } catch (IOException e) {

                     e.printStackTrace();

              }

 

       }

 

}

基本能实现网页抓取,不过要手动输入URL,此外没有重构。只是一个简单的思路。

 

1.htmlparser 使用

htmlparser是一个纯的java写的html解析的库,htmlparser不依赖于其它的java库,htmlparser主要用于改造 或提取html。htmlparser能超高速解析html,而且不会出错。毫不夸张地说,htmlparser就是目前最好的html解 析和分析的工具。无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。由于htmlparser 结构设计精良,所以扩展htmlparser 非常便利。

 

Constructor Summary

Parser()

Parser(URLConnection connection) 
          Construct a parser using the provided URLConnection.

Method:

static Parser createParser(String html, String charset) 
          Creates the parser on an input string.

 void visitAllNodesWith(NodeVisitor visitor) 
          Apply the given visitor to the current page.

 

HtmlPage(Parser parser)

 NodeList

getBody() 
           

 TableTag[]

getTables() 
           

 String

getTitle() 
           

 void

setTitle(String title) 
           

 void

visitTag(Tag tag) 
          Called for each Tag visited.

 

 

Constructor Summary

NodeList() 
           

 

NodeList(Node node) 
          Create a one element node list.

 

  NodeList extractAllNodesThatMatch(NodeFilter filter) 
          Filter the list with the given filter non-recursively.  

NodeList extractAllNodesThatMatch(NodeFilter filter, boolean recursive) 
          Filter the list with the given filter.

 Node elementAt(int i)

 

 

1. html代码里面所有的链接地址和链接名称

 

package parser;

 

import org.htmlparser.Parser;

import org.htmlparser.Node;

import org.htmlparser.NodeFilter;

import org.htmlparser.Parser;

import org.htmlparser.filters.TagNameFilter;

import org.htmlparser.tags.LinkTag;

import org.htmlparser.tags.TableTag;

import org.htmlparser.util.NodeList;

import org.htmlparser.util.ParserException;

import org.htmlparser.visitors.HtmlPage;

 

/**

 * htmlparser取得一段html代码里面所有的链接地址和链接名称

 *

 * @author chenguoyong

 *

 */

public class Testhtmlparser {

 

       /**

       * @param args

       */

       public static void main(String[] args) {

              String htmlcode = "<HTML><HEAD><TITLE>AAA</TITLE></HEAD><BODY>"

                            + "<a href="http://topic.csdn.net/u/20080522/14/0ff402ef-c382-499a-8213-ba6b2f550425.html">连接1</a>"

                            + "<a href="http://topic.csdn.net">连接2</a></BODY></HTML>";

              // 创建Parser对象根据传给字符串和指定的编码

              Parser parser = Parser.createParser(htmlcode, "GBK");

              // 创建HtmlPage对象HtmlPage(Parser parser)

              HtmlPage page = new HtmlPage(parser);

              try {

                     // HtmlPage extends visitor,Apply the given visitor to the current

                     // page.

                     parser.visitAllNodesWith(page);

              } catch (ParserException e1) {

                     e1 = null;

              }

              // 所有的节点

              NodeList nodelist = page.getBody();

              // 建立一个节点filter用于过滤节点

              NodeFilter filter = new TagNameFilter("A");

              // 得到所有过滤后,想要的节点

              nodelist = nodelist.extractAllNodesThatMatch(filter, true);

              for (int i = 0; i < nodelist.size(); i++) {

                     LinkTag link = (LinkTag) nodelist.elementAt(i);

                     // 链接地址

                     System.out.println(link.getAttribute("href") + " ");

                     // 链接名称

                     System.out.println(link.getStringText());

              }

 

       }

 

}

 

 

2. 使用HtmlParser抓去网页内容

package parser;

 

import org.htmlparser.Parser;

import org.htmlparser.beans.StringBean;

import org.htmlparser.filters.NodeClassFilter;

import org.htmlparser.parserapplications.StringExtractor;

import org.htmlparser.tags.BodyTag;

import org.htmlparser.util.NodeList;

import org.htmlparser.util.ParserException;

 

/**

 * 使用HtmlParser抓去网页内容: 要抓去页面的内容最方便的方法就是使用StringBean. 里面有几个控制页面内容的几个参数.

 * 在后面的代码中会有说明. Htmlparser包中还有一个示例StringExtractor 里面有个直接得到内容的方法,

 * 其中也是使用了StringBean . 另外直接解析Parser的每个标签也可以的.

 *

 * @author chenguoyong

 *

 */

public class GetContent {

       public void getContentUsingStringBean(String url) {

              StringBean sb = new StringBean();

              sb.setLinks(true); // 是否显示web页面的连接(Links)

              // 为了取得页面的整洁美观一般设置上面两项为true , 如果要保持页面的原有格式, 如代码页面的空格缩进 可以设置为false

              sb.setCollapse(true); // 如果是true的话把一系列空白字符用一个字符替代.

              sb.setReplaceNonBreakingSpaces(true);// If true regular space

              sb

                            .setURL("http://www.blogjava.net/51AOP/archive/2006/07/19/59064.html");

              System.out.println("The Content is : " + sb.getStrings());

 

       }

 

       public void getContentUsingStringExtractor(String url, boolean link) {

              // StringExtractor内部机制和上面的一样.做了一下包装

              StringExtractor se = new StringExtractor(url);

              String text = null;

              try {

                     text = se.extractStrings(link);

                     System.out.println("The content is : " + text);

              } catch (ParserException e) {

                     e.printStackTrace();

              }

       }

 

       public void getContentUsingParser(String url) {

              NodeList nl;

              try {

                     Parser p = new Parser(url);

                     nl = p.parse(new NodeClassFilter(BodyTag.class));

                     BodyTag bt = (BodyTag) nl.elementAt(0);

                     System.out.println(bt.toPlainTextString()); // 保留原来的内容格式. 包含js代码

              } catch (ParserException e) {

                     e.printStackTrace();

              }

       }

 

       /**

       * @param args

       */

       public static void main(String[] args) {

              String url = "http://www.blogjava.net/51AOP/archive/2006/07/19/59064.html";

              //new GetContent().getContentUsingParser(url);

              //--------------------------------------------------

              new GetContent().getContentUsingStringBean(url);

 

       }

 

}

 

3.将整个html内容保存到指定文件

 

package parser;

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.net.MalformedURLException;

import java.net.URL;

 

/**

 * 基本能实现网页抓取,不过要手动输入URL 将整个html内容保存到指定文件

 *

 * @author chenguoyong

 *

 */

public class ScrubSelectedWeb {

       private final static String CRLF = System.getProperty("line.separator");

 

       /**

       * @param args

       */

       public static void main(String[] args) {

              try {

                     URL ur = new URL("http://www.google.cn/");

                     InputStream instr = ur.openStream();

                     String s, str;

                     BufferedReader in = new BufferedReader(new InputStreamReader(instr));

                     StringBuffer sb = new StringBuffer();

                     BufferedWriter out = new BufferedWriter(new FileWriter(

                                   "D:/outPut.txt"));

                     while ((s = in.readLine()) != null) {

                            sb.append(s + CRLF);

                     }

                     System.out.println(sb);

                     str = new String(sb);

                     out.write(str);

                     out.close();

                     in.close();

              } catch (MalformedURLException e) {

                     e.printStackTrace();

              } catch (IOException e) {

                     e.printStackTrace();

              }

 

       }

 

}

 

4利用htmlparser提取网页纯文本的例子

 

package parser;

 

import org.htmlparser.Node;

import org.htmlparser.NodeFilter;

import org.htmlparser.Parser;

import org.htmlparser.filters.TagNameFilter;

import org.htmlparser.tags.TableTag;

import org.htmlparser.util.NodeList;

 

/**

 * 标题:利用htmlparser提取网页纯文本的例子

 */

public class TestHTMLParser2 {

       /**

       * 读取目标html内容

       *

       */

       public static void testHtml() {

              try {

                     String sCurrentLine;

                     String sTotalString;

                     sCurrentLine = "";

                     sTotalString = "";

                     java.io.InputStream l_urlStream;

                     java.net.URL l_url = new java.net.URL(

                                   "http://10.249.187.199:8083/injs100/");

                     java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url

                                   .openConnection();

                     l_connection.connect();

                     l_urlStream = l_connection.getInputStream();

                     java.io.BufferedReader l_reader = new java.io.BufferedReader(

                                   new java.io.InputStreamReader(l_urlStream));

                     while ((sCurrentLine = l_reader.readLine()) != null) {

                            sTotalString += sCurrentLine + " ";

                     }

 

                     String testText = extractText(sTotalString);

              } catch (Exception e) {

                     e.printStackTrace();

              }

 

       }

    /**

     * 抽取纯文本信息

     * @param inputHtml:html文本

     * @return

     * @throws Exception

     */

       public static String extractText(String inputHtml) throws Exception {

              StringBuffer text = new StringBuffer();

              Parser parser = Parser.createParser(new String(inputHtml.getBytes(),

                            "GBK"), "GBK");

              // 遍历所有的节点

              NodeList nodes = parser.extractAllNodesThatMatch(new NodeFilter() {

                     public boolean accept(Node node) {

                            return true;

                     }

              });

 

              System.out.println(nodes.size());

              for (int i = 0; i < nodes.size(); i++) {

                     Node nodet = nodes.elementAt(i);

                     //字符串的代表性节点:节点的描述

                     text.append(new String(nodet.toPlainTextString().getBytes("GBK"))

                                   + " ");

              }

              return text.toString();

       }

    /**

     *  读取文件的方式/utl 来分析内容. filePath也可以是一个Url.

     * @param resource :文件/Url

     * @throws Exception

     */

       public static void test5(String resource) throws Exception {

              Parser myParser = new Parser(resource);

              myParser.setEncoding("GBK");

              String filterStr = "table";

              NodeFilter filter = new TagNameFilter(filterStr);

              NodeList nodeList = myParser.extractAllNodesThatMatch(filter);

              /*for(int i=0;i<nodeList.size();i++)

              {

                     TableTag tabletag = (TableTag) nodeList.elementAt(i);

                     //标签名称

                     System.out.println(tabletag.getTagName());

                     System.out.println(tabletag.getText());

              }*/

              TableTag tabletag = (TableTag) nodeList.elementAt(1);

             

             

             

 

       }

 

       public static void main(String[] args) throws Exception {

              test5("http://10.249.187.199:8083/injs100/");

              //testHtml();

       }

}

 

5.html解析table

 

package parser;

 

import org.apache.log4j.Logger;

import org.htmlparser.NodeFilter;

import org.htmlparser.Parser;

import org.htmlparser.filters.NodeClassFilter;<

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。