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.自己处理,可以用些设计模式,留待有空时做。