六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 148|回复: 0

使用nokeHTML解析HTML文件

[复制链接]

升级  73.8%

273

主题

273

主题

273

主题

进士

Rank: 4

积分
869
 楼主| 发表于 2013-2-7 19:42:02 | 显示全部楼层 |阅读模式
 
             在Luence搜索引擎中必须得到文件的InputStream的流对象的同时解析文件流中的信息:可以使用的集中组件:nokeHTML解析和HTMLParser解析。所以分别使用两个组件做解析比较结果
 
下面是nokeHTML的解析测试类:
 
package com.unutrip.remoting.ws;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.html.dom.HTMLDocumentImpl;
import org.cyberneko.html.parsers.DOMFragmentParser;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
 * 使用nekohtml解析HTML文件
 *
 * @author longgangbai
 *
 */
public class HTMLParser {
 /**
  * 从html中抽取纯文本
  *
  * @param content
  * @return
  * @throws UnsupportedEncodingException
  */
 public static String extractTextFromHTML(String content)
   throws UnsupportedEncodingException {
  DOMFragmentParser parser = new DOMFragmentParser();
  DocumentFragment node = new HTMLDocumentImpl().createDocumentFragment();
  InputStream is = new ByteArrayInputStream(content.getBytes());
  try {
   parser.parse(new InputSource(is), node);
  } catch (IOException e) {
   e.printStackTrace();
  } catch (SAXException se) {
   se.printStackTrace();
  }
  StringBuffer newContent = new StringBuffer();
  getText(newContent, node);
  String str = (new String(newContent.toString().getBytes("ISO-8859-1"),
    "UTF-8"));
  return str;
 }
 private static void getText(StringBuffer sb, Node node) {
  if (node.getNodeType() == Node.TEXT_NODE) {
   sb.append(node.getNodeValue());
  }
  if (node.getNodeType() == Node.ELEMENT_NODE) {
   Element elmt = (Element) node;
   // 抛弃脚本
   if ((elmt.getTagName().equals("STYLE") || elmt.getTagName().equals(
     "SCRIPT"))) {
    sb.append("");
   }
  }
  NodeList children = node.getChildNodes();
  if (children != null) {
   int len = children.getLength();
   for (int i = 0; i < len; i++) {
    getText(sb, children.item(i));
   }
  }
 }
 public static String getHtmlContext(String htmlPath) throws Exception {
  BufferedReader br = new BufferedReader(new FileReader(
    new File(htmlPath)));
  StringBuilder sb = new StringBuilder();
  String tmp = null;
  while ((tmp = br.readLine()) != null) {
   sb.append(tmp);
  }
  String context = extractTextFromHTML(sb.toString());
  System.out.println("context" + context);
  return context;
 }
 public static void main(String[] args) {
  try {
   getHtmlContext("D://fy_choice.html");
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
 
解析效果不是很好,同时需要xerces.jar支持,部分HTML信息解析带有有乱码信息?不可识别不爽呀?
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表