如何使用htmlparser提取网页文本信息

 我来答
泷驰逸0iK
2016-03-11 · 知道合伙人互联网行家
泷驰逸0iK
知道合伙人互联网行家
采纳数:388 获赞数:2714
曾就职于五八同城、百度推广某渠道、连山区口腔医院。于2017年创办葫芦岛搜葫传媒有限公司。

向TA提问 私信TA
展开全部
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/
育知同创教育
2016-03-05 · 百度知道合伙人官方认证企业
育知同创教育
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】
向TA提问
展开全部
// 提取网页主要文本内容
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();
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式