对比 htmlcxx (c++)和 htmlparser(java) :
1. 功能上htmlparser会更强大一些,提供了filter/http下载等能力,还有vistor模式等等,灵活强大;而htmlcxx主要是一个分析库,有html/css两个分析器,可以将内容分析为dom类型的节点树,以提供遍历的能力,还可以分析节点的属性,相比之下也比较灵活;
2. 两者在分析tag方面的能力相差不大,性能上,感觉htmlcxx速度比htmlparser快很多(不知道是不是我的elicpse导致的);
范例:
//htmlcxx_test.cc
tree tr;
HTML::ParserDom parser;
parser.parse(sFileBuffer);
tr = parser.getTree();
tree::iterator it = tr.begin();
while(it++ != tr.end())
{
if (!it->isTag())
continue;
if (it->tagName().compare(“a”) == 0)
{
it->parseAttributes();
cout < < "a:href:" << it->attribute(“href”).second < < endl;
}
else if (it->tagName().compare(“script”) == 0)
{
it->parseAttributes();
cout < < "script:src:" << it->attribute(“src”).second < < endl;
}
else if (it->tagName().compare(“img”) == 0)
{
it->parseAttributes();
cout < < "img:src:" << it->attribute(“src”).second < < endl;
}
else if (it->tagName().compare(“link”) == 0)
{
it->parseAttributes();
cout < < "link:href:" << it->attribute(“href”).second < < endl;
//std::cout <<"show:"<< it->text() < < endl;
}
//htmlparser_test.java
Parser parser = new Parser(args[0]);
//parser.setInputHTML(file);
NodeList tags = parser.parse(new myFilter());
// = parser.extractAllNodesThatMatch();
SimpleNodeIterator iter = tags.elements();
while(iter.hasMoreNodes())
{
TagNode tag = (TagNode)iter.nextNode();
if (tag.getTagName().equalsIgnoreCase("a") ||
tag.getTagName().equalsIgnoreCase("link") )
{
System.out.println("a|link:" + tag.getAttribute("href"));
}
else if (tag.getTagName().equalsIgnoreCase("img") ||
tag.getTagName().equalsIgnoreCase("script") )
{
System.out.println("img|script:" + tag.getAttribute("src"));
}
}
===============================
其他一些类似库:
1. htcheck 主要是一个破link检测工具,里面有一个htparser库,可惜写的有些糟糕,又没有例子,难以啃下;
2. htmlparser1.0 代码风格相当不错,似乎是mozilla一位贡献者的作品,可惜需要安装qt,而且功能较少,只能分析link
3. htmlpaser_v200 一个分布式引擎的开源组件,可惜是.net的
4. HTMLReader 来自codeproject的htmlreader,似乎主要是用来加亮语法