如何使用htmlparser提取网页文本信息
发布网友
发布时间:2022-04-23 22:53
我来回答
共2个回答
热心网友
时间:2022-04-19 00:24
HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索。对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用,基本各种需求都可以满足。比如问题中提到的提取网页文本信息。
用以下代码来实现提取网页文本信息
// 提取网页主要文本内容
public String getContent(){
content=(isHub())?getHubEntries():getTopicBlock();
System.out.println("<Content>:");
System.out.println("=========================");
System.out.println(content);
return content;
}
// 提取Hub类网页文本内容,如yahoo,sina等门户网
public String getHubEntries(){
StringBean bean=new StringBean();
bean.setLinks(false);
bean.setReplaceNonBreakingSpaces(true);
bean.setCollapse(true);
try {
parser.visitAllNodesWith(bean);
} catch (ParserException e) {
System.err.println("getHubEntries()-->"+e);
}
parser.reset();
return bean.getStrings();
}
// 获取主题性(Topical)网页文本内容:对于博客等以文字为主体的网页效果较好
public String getTopicBlock(){
HasParentFilter acceptedFilter=new HasParentFilter(new TagNameFilter("p"));
NodeList nodes=null;
try {
nodes=parser.extractAllNodesThatMatch(acceptedFilter);
} catch (ParserException e) {
System.err.println("getTopicBlock"+e);
}
StringBuffer sb=new StringBuffer();
SimpleNodeIterator iter=nodes.elements();
while(iter.hasMoreNodes()){
Node node=iter.nextNode();
sb.append(node.getText()+"\n");
}
parser.reset();
return sb.toString();
}
另外,要知道的是
HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:
public Parser ();
public Parser (Lexer lexer, ParserFeedback fb);
public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;
public Parser (String resource, ParserFeedback feedback) throws ParserException;
public Parser (String resource) throws ParserException;
public Parser (Lexer lexer);
public Parser (URLConnection connection) throws ParserException;
和一个静态类public static Parser createParser (String html, String charset);
提供几个常用的
对于树型结构进行遍历的函数,这些函数最容易理解:
Node getParent ():取得父节点
NodeList getChildren ():取得子节点的列表
Node getFirstChild ():取得第一个子节点
Node getLastChild ():取得最后一个子节点
Node getPreviousSibling ():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)
Node getNextSibling ():取得下一个兄弟节点
取得Node内容的函数:
String getText ():取得文本
String toPlainTextString():取得纯文本信息。
String toHtml () :取得HTML信息(原始HTML)
String toHtml (boolean verbatim):取得HTML信息(原始HTML)
String toString ():取得字符串信息(原始HTML)
Page getPage ():取得这个Node对应的Page对象
int getStartPosition ():取得这个Node在HTML页面中的起始位置
int getEndPosition ():取得这个Node在HTML页面中的结束位置
用于Filter过滤的函数:
void collectInto (NodeList list, NodeFilter filter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。
用于Visitor遍历的函数:
void accept (NodeVisitor visitor):对这个Node应用visitor
用于修改内容的函数,这类用得比较少:
void setPage (Page page):设置这个Node对应的Page对象
void setText (String text):设置文本
void setChildren (NodeList children):设置子节点列表
其他函数:
void doSemanticAction ():执行这个Node对应的操作(只有少数Tag有对应的操作)
Object clone ():接口Clone的抽象函数。
以上知识可以完整处理HTML页面的所有内容
参考资料:
htmlparser官方网站下载地址
http://www.htmlparser.sourceforge.net/
热心网友
时间:2022-04-19 01:42
// 提取网页主要文本内容
public String getContent(){
content=(isHub())?getHubEntries():getTopicBlock();
System.out.println("<Content>:");
System.out.println("=========================");
System.out.println(content);
return content;
}
// 提取Hub类网页文本内容,如yahoo,sina等门户网
public String getHubEntries(){
StringBean bean=new StringBean();
bean.setLinks(false);
bean.setReplaceNonBreakingSpaces(true);
bean.setCollapse(true);
try {
parser.visitAllNodesWith(bean);
} catch (ParserException e) {
System.err.println("getHubEntries()-->"+e);
}
parser.reset();
return bean.getStrings();
}
// 获取主题性(Topical)网页文本内容:对于博客等以文字为主体的网页效果较好
public String getTopicBlock(){
HasParentFilter acceptedFilter=new HasParentFilter(new TagNameFilter("p"));
NodeList nodes=null;
try {
nodes=parser.extractAllNodesThatMatch(acceptedFilter);
} catch (ParserException e) {
System.err.println("getTopicBlock"+e);
}
StringBuffer sb=new StringBuffer();
SimpleNodeIterator iter=nodes.elements();
while(iter.hasMoreNodes()){
Node node=iter.nextNode();
sb.append(node.getText()+"\n");
}
parser.reset();
return sb.toString();
}