浏览 8566 次
锁定老帖子 主题:从HTML抽取纯文本
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-04-20
spider中需要提取纯文本: 1.javax.swing.text 这种方法比较麻烦,自己写很多的callback,效率很低,效果不见得好 2.htmlparser 方便,但是不规则的htm效果太差,总是遗留大量的tag package testlucene; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.NodeClassFilter; import org.htmlparser.filters.OrFilter; import org.htmlparser.nodes.TextNode; import org.htmlparser.tags.LinkTag; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import org.htmlparser.visitors.HtmlPage; /** * 演示了Html Parse的应用. * * @author scud http://www.jscud.com */ public class HtmlParser { public static void main(String[] args) throws Exception { String aFile = "d:/1.html"; String content = readTextFile(aFile, "GBK"); // System.out.println(test1(content)); // test2(content); // System.out.println("===================================="); System.out.println(getText(content)); // System.out.println("===================================="); // test4(content); // System.out.println("===================================="); // test5(aFile); // SSystem.out.println("===================================="); } /** * 读取文件的方式来分析内容. filePath也可以是一个Url. * * @param resource * 文件/Url */ public static void test5(String resource) throws Exception { Parser myParser = new Parser(resource); // 设置编码 myParser.setEncoding("GBK"); HtmlPage visitor = new HtmlPage(myParser); myParser.visitAllNodesWith(visitor); String textInPage = visitor.getTitle(); System.out.println(textInPage); } /** * 得到普通文本和链接的内容. * * 使用了过滤条件. */ public static String getText(String content) throws ParserException { Parser myParser; NodeList nodeList = null; StringBuilder result = new StringBuilder(); myParser = Parser.createParser(content, "GBK"); NodeFilter textFilter = new NodeClassFilter(TextNode.class); NodeFilter linkFilter = new NodeClassFilter(LinkTag.class); // 暂时不处理 meta // NodeFilter metaFilter = new NodeClassFilter(MetaTag.class); OrFilter lastFilter = new OrFilter(); lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter }); nodeList = myParser.parse(lastFilter); Node[] nodes = nodeList.toNodeArray(); String line = ""; for (int i = 0; i < nodes.length; i++) { Node anode = (Node) nodes[i]; if (anode instanceof TextNode) { TextNode textnode = (TextNode) anode; // line = textnode.toPlainTextString().trim(); line = textnode.getText(); } else if (anode instanceof LinkTag) { LinkTag linknode = (LinkTag) anode; line = linknode.getLink(); // @todo 过滤jsp标签:可以自己实现这个函数 // line = StringFunc.replace(line, "<%.*%>", ""); } if (isTrimEmpty(line)) continue; // System.out.println(line); result.append(line); } return result.toString(); } /** * 读取一个文件到字符串里. * * @param sFileName * 文件名 * @param sEncode * String * @return 文件内容 */ public static String readTextFile(String sFileName, String sEncode) { StringBuffer sbStr = new StringBuffer(); try { File ff = new File(sFileName); InputStreamReader read = new InputStreamReader(new FileInputStream( ff), sEncode); BufferedReader ins = new BufferedReader(read); String dataLine = ""; while (null != (dataLine = ins.readLine())) { sbStr.append(dataLine); sbStr.append("\r\n"); } ins.close(); } catch (Exception e) { e.printStackTrace(); } return sbStr.toString(); } /** * 去掉左右空格后字符串是否为空 * * @param astr * String * @return boolean */ public static boolean isTrimEmpty(String astr) { if ((null == astr) || (astr.length() == 0)) { return true; } if (isBlank(astr.trim())) { return true; } return false; } /** * 字符串是否为空:null或者长度为0. * * @param astr * 源字符串. * @return boolean */ public static boolean isBlank(String astr) { if ((null == astr) || (astr.length() == 0)) { return true; } else { return false; } } } 3.regex 很简单,很实用,会丢失信息,对js不太支持,不过可以与处理一下 text = Scontent.replaceAll("<[^>]*>",""); 4.自己处理,可以用些设计模式,留待有空时做。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |