文章中过滤HTML标签的问题,欢迎讨论

wangxiaomax 2004-10-20 09:08:15
全文检索出一段文章,简要内容显示,我想过滤掉所有的HTML标签,只剩下文本内容然后再截取部分显示。由于考虑到中国的书名号写法,光去除<>标签是不对的。我是用htmlparser的包,但它好像没有我所需求的方法,倒是可以分析到每个节点。下面是我写的代码。
String testhtml = "我们是害虫<table>1234567890<table>lk你好中国";
Parser parser = Parser.createParser(new String(testhtml.getBytes(),"8859_1"), "GBK");
for (NodeIterator ni = parser.elements(); ni.hasMoreNodes(); ) {
Node node = ni.nextNode();
System.out.println(new String(node.getText().getBytes("8859_1")));
System.out.println(new String(node.toHtml().getBytes("8859_1")));
}
还是就是这篇文章也有比较多的说明。
http://www-900.ibm.com/developerWorks/cn/java/l-html-parser/index.shtml?ca=dwcn-newsletter-java

现在我的问题是,如果把所有的HTML标签脱掉,不一定要用htmlparser包,只要能实现就行?欢迎大家讨论。
...全文
743 点赞 收藏 16
写回复
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mygia 2005-05-18
好东西。收藏!!
回复
wangxiaomax 2004-10-20
看来要写的准确,要做的工作,还是很多地。
我也再想想,有没有更简单些的方法。
下班前结帖。
回复
禽兽v5 2004-10-20
html 4.0 所有标签列表

<A </A> <ABBR> <ABBR </ABBR> <ABOVE> <ACRONYM> <ACRONYM </ACRONYM> <ADDRESS> <ADDRESS </ADDRESS> <APPLET </APPLET> <ARRAY> <AREA </AREA
<B> <B </B> <BASE <BASEFONT <BDO> <BDO </BDO> <BGSOUND <BIG> <BIG </BIG> <BLINK> </BLINK> <BLOCKQUOTE> <BLOCKQUOTE </BLOCKQUOTE> <BODY <BODY> </BODY> <BOX> <BR <BR> <BIG <BLINK <BUTTON> </BUTTON>
<CAPTION> <CAPTION </CAPTION> <CENTER> <CENTER </CENTER> <CITE> <CITE </CITE> <CODE> <CODE </CODE> <COL> <COL <COLGROUP <COLGROUP> </COLGROUP> <COMMENT> </COMMENT>
<DD> <DD </DD> <DEL> <DEL </DEL> <DFN> <DFN </DFN> <DIR> <DIR </DIR> <DIV> <DIV </DIV> <DL> <DL </DL> <DT> <DT </DT>
<EM> <EM </EM> <EMBED
<FIELDSET> <FIELDSET </FIELDSET> <FIG> <FONT </FONT> <FORM> <FORM </FORM> <FRAME <FRAMESET </FRAMESET>
<H1> <H1 </H1> <H2> <H2 </H2> <H3> <H3 </H3> <H4> <H4 </H4> <H5> <H5 </H5> <H6> <H6 </H6> <HEAD> <HEAD </HEAD> <HR> <HR <HTML> <HTML </HTML>
<I> <I </I> <IFRAME> </IFRAME> <ILAYER> </ILAYER> <IMG <INPUT> <INPUT <INS> <INS </INS> <ISINDEX> <ISINDEX
<KBD> <KBD </KBD>
<LABEL> <LABEL </LABEL> <LAYER> <LAYER </LAYER> <LEGEND> <LEGEND </LEGEND> <LI> <LI </LI> <LINK <LISTING> </LISTING>
<MAP </MAP> <MARQUEE </MARQUEE> <MENU> <MENU </MENU> <META <MULTICOL> </MULTICOL>
<NEXTID <NOBR> </NOBR> <NOFRAMES> </NOFRAMES> <NOLAYER> </NOLAYER> <NOTE> </NOTE> <NOSCRIPT> </NOSCRIPT>
<OBJECT> <OBJECT </OBJECT> <OL> <OL </OL> <OPTION> <OPTION </OPTION> <OPTGROUP> <OPTGROUP </OPTGROUP>
<P <P> </P> <PARAM <PRE> <PRE </PRE>
<Q> <Q </Q> <QUOTE>
<RANGE> <ROOT>
<S> <S </S> <SAMP> <SAMP </SAMP> <SCRIPT <SCRIPT> </SCRIPT> <SELECT <SELECT> </SELECT> <SMALL> <SMALL </SMALL> <SOUND <SPACER> <SPAN> <SPAN </SPAN> <SQRT> <STRIKE> <STRIKE </STRIKE> <STRONG> <STRONG </STRONG> <STYLE> <STYLE </STYLE> <SUB> <SUB </SUB> <SUP> <SUP </SUP>
<TABLE> <TABLE </TABLE> <TBODY> <TBODY </TBODY> <TD <TD> </TD> <TEXT> <TEXTAREA <TEXTAREA> </TEXTAREA> <TFOOT> <TFOOT </TFOOT> <TH <TH> </TH> <THEAD> <THEAD </THEAD> <TITLE> </TITLE> <TR <TR> </TR> <TT> </TT> <TT
<U> <U </U> <UL> <UL </UL>
<VAR> </VAR> <VAR
<WBR>
<XMP> </XMP>
回复
禽兽v5 2004-10-20
<新警察故事>,<2046>
从编程的角度看,这是中文xml标签。-_-||

你可以加一步关键字过滤,用正则表达式Matcher.group匹配出<>中的值,判断是否是一个以html关键字开始的字符串,如果是则表示是html标签,否则否之。
回复
禽兽v5 2004-10-20
System.out.println(
str.replaceAll("</?[^>]+>", "")
);
回复
形印声传 2004-10-20
那就只有用字符串分析咯,去掉所有由"<"和"/>"包含的内容,不过麻烦多了
回复
javafaq2004 2004-10-20
可以考虑把他当XML看,取body节点里头的text。
回复
wangxiaomax 2004-10-20
有谁知道啊。多谢各位达人帮忙。
回复
wangxiaomax 2004-10-20
to tigeryu(吴越小虎):
请问StringNode,StringHelper是哪个包里的?我怎么找不到呢。多谢。
我只加载了htmlparser.jar,htmllexer.jar,是1.5的版本。
回复
hjfhjf 2004-10-20
str.replaceAll用这个函数来替代你所需要过滤的HTML字符
回复
qiyao 2004-10-20
<--------------高手看过来! 能不能搞定这个?
http://community.csdn.net/Expert/topic/3472/3472337.xml?temp=.1701624
回复
wuyue-tiger 2004-10-20
里边用到了几个我自已写的方法,都是很简单,看方法名就知道是干嘛的,补充一下import

import java.io.*;
import org.htmlparser.*;
import org.htmlparser.tags.*;
import org.htmlparser.util.*;
回复
wuyue-tiger 2004-10-20
我用的也是 HTMLParser,下面是我的代码,准确率很高,但由于HTMLParser的局限性,仍有些时候会有问题

public class HtmlParser extends IParser {

/**
* 解析文档, 获得文档正文
* @param content 原始文档内容
* @return 文档正文
*/
public String parseFromContent(String content) {
NodeReader reader = new NodeReader(new StringReader(content), content
.length());
Parser parser = new Parser(reader);
return parse(parser);
}

/**
* 解析文档, 获得文档正文
* @param filename 文件名称
* @return 文档正文
*/
public String parseFromFile(String filename) {
try {
Parser parser = new Parser(filename);
return parse(parser);
} catch (ParserException ex) {
Log.error(ex);
return null;
}
}

private String parse(Parser parser) {
try {
StringBuffer results = new StringBuffer("");
//使用 HtmlParser 1.3 以上版本的代码
parser.setEncoding("GBK");
NodeIterator ni = parser.elements();
boolean encode = "ISO-8859-1"
.equalsIgnoreCase(parser.getEncoding());
String tagName = null;
while (ni.hasMoreNodes()) {
Object obj = ni.nextNode();
if (obj instanceof Tag) {
Tag tag = (Tag) obj;
tagName = tag.getTagName();
} else if (obj instanceof StringNode
&& !"SCRIPT".equals(tagName)
&& !"STYLE".equals(tagName)) {
Node node = (Node) obj;
String text = node.toPlainTextString();
if (encode) {
try {
text = new String(text.getBytes("ISO-8859-1"));
} catch (UnsupportedEncodingException ex) {
Log.warn(ex);
}
}
text = Translate.decode(text);
text = StringHelper.mergeSpace(text);
text = text.trim();
if (!"".equals(text)) {
results.append(text + " ");
}
}
}
return new String(results);
} catch (ParserException ex) {
Log.error(ex);
return null;
}
}

}
回复
qiyao 2004-10-20
<--------------高手看过来! 能不能搞定这个?
http://community.csdn.net/Expert/topic/3472/3472337.xml?temp=.1701624
回复
javafaq2004 2004-10-20
还可以直接通过IE来过滤,比如启动IE,全选,复制,粘贴到记事本,读取记事本的内容。
回复
javafaq2004 2004-10-20
<新警察故事>

从编程的角度看,他没有结束标记,只能算特殊字符。^_^
回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告