Posted on 2010-04-23 17:38
泰仔在线 阅读(3067)
评论(1) 编辑 收藏 所属分类:
云计算相关
今天主要研究了Nutch中的html页面的解析问题,因为我的任务是从页面中提取特定的文本,因此首先要找到Nutch如何将html中的文本提取出来。Nutch提供了两种html解析器,nekohtml和tagsoup,我采用了neko的解析器,在看了代码后,发现其提取文本的方法在org.apache.nutch.parse.html中的DOMContentUtils文件中,主要的函数是getTextHelper。下面做一下解释。
private boolean getTextHelper(StringBuffer sb, Node node,
boolean abortOnNestedAnchors,
int anchorDepth) {
boolean abort = false;
NodeWalker walker = new NodeWalker(node);// NodeWalk类用来非递归遍历DOM树节点
int myint=1;
while (walker.hasNext()){ //如果存在节点
Node currentNode = walker.nextNode();//获取下一个节点
String nodeName = currentNode.getNodeName();//获取节点名
short nodeType = currentNode.getNodeType();//节点类型
if ("script".equalsIgnoreCase(nodeName)) {//不处理脚本
walker.skipChildren();
}
if ("style".equalsIgnoreCase(nodeName)) {//不处理style
walker.skipChildren();
}
if (abortOnNestedAnchors && "a".equalsIgnoreCase(nodeName)) {//检测是否嵌套
anchorDepth++;
if (anchorDepth > 1) {
abort = true;
break;
}
}
if (nodeType == Node.COMMENT_NODE) {//不处理注释
walker.skipChildren();
}
if (nodeType == Node.TEXT_NODE) {
// cleanup and trim the value
String text = currentNode.getNodeValue();//获取文本内容
text = text.replaceAll("\\s+", " ");//消除所有空格和转行等字符
text = text.trim();
if (text.length() > 0) {
if (sb.length() > 0) sb.append(' ');
sb.append(text);
}
}
}
}
调用这个函数的类是htmlParser类,如果想自己写一个提取文本的函数,可以做相应修改。
转自:
实习日记(六)