这几天被chm文档的
自动化测试搞得有点烦躁,脾气也不大好。别人问问题的时候,语气自己都感觉很差。闲话少说,言归正传,之前已经用chmlib解压出了chm文件的
html文件,接下来要做的事,就是从html文件分析。
分析html文件,最关心的是正文,哪些html标签根本不用关心,而且必须要去除掉。最先想到的思路,是通过selenium操作浏览器打开html文件,然后抓取页面元素提取。本来以为可行,实际试了下,html正文是由很多短标签的text凑在一起的,小段文本太多了,这个文本抓取太烦了,压根行不通。这个思路,其实没有去掉标签,所以不行。所以剩下的思路,就是要抽取html文件的正文,直接对正文进行分析。
有事就找度娘,一个字就是搜!实在不想自己操刀进行解析html,谁都知道html文件是很混乱的,不想踏入泥潭。无奈,搜了很多HtmlParser开源代码,都未能满意,c、c++、python版本,几乎都不满意(边外语,
java版本有很多,实在不想引入java,估计搞c++的,先天排斥java,哎,啥时候能治愈好?)。
尝试了大半天,下载了很多代码都不行。回到宿舍,狠了狠心,动手写吧,html不就是一棵树,分析树,就用STL,开始干。说起来容易,做起来难,坚持了一两个小时,写了200行,就感觉不行了,太烦躁,发觉越来越不想自己动手写代码了,现在几乎完全成了抄代码的节奏?分析字符串,忽略无效的空格、tab,就写了三个版本,三个版本都不满意,感觉差别不大(心里还记着,sip协议自动化,写的协议解析感觉糟糕,到现在都没进步吗?)指针,迭代器,指针,迭代器,用指针还是用迭代器?to be or not to be,that's a question(什么意思啊,土鳖,或者不土鳖?)
size_t walk_blank(const string &str, size_t pos )
{
assert( pos >= 0 && pos < str.size() );
size_t len = str.size();
for(; pos < len; ++pos )
{
if( str[pos] == ' ' || str[pos] == '\t' )
continue;
return pos;
}
if( pos == len )
{
return string::npos;
}
return pos;
}
const char* walk_blank( const char*begin, const char*end )
{
const char*cur = begin;
for(; cur != end; ++cur )
{
if( *cur == ' ' || *cur == '\t' )
continue;
return cur;
}
return cur;
}
typedef string::const_iterator csiter;
csiter walk_blank( csiter begin, csiter end )
{
csiter cur = begin;
for(; cur != end; ++cur )
{
if( *cur == ' ' || *cur == '\t' )
continue;
return cur;
}
return end;
}
最终我还是放弃了,还是抄吧。继续上网搜索,不行通宵搜。因此,这次耐心点了,htmlcxx进入眼帘。其实在公司搜的时候,就找到这个库了,但看到说是05年就不更新了,总是找个新点的吧,就忽略了htmlcxx。看了看,有点眉目,下载下来仔细测试,正是所需要的东西,纯c++,规模也小,很适合集成源代码使用,这爽!上样例代码。
int main (int argc, const char * argv[])
{
string html = "<html><body>hey<link href=\"http://www.apple.com\" /><input/><p>haha</p></body></html>";
HTML::ParserDom parser;
tree<HTML::Node> dom = parser.parseTree(html);
tree<HTML::Node>::iterator it = dom.begin();
tree<HTML::Node>::iterator end = dom.end();
it = dom.begin();
end = dom.end();
for (; it != end; ++it)
{
if ((!it->isTag()) && (!it->isComment()))
{
cout << "Found text: ";
cout << it->text() << endl;
}
}
return 0;
}
输出:
Found text: hey
Found text: haha
使用超级简单!!趁热打铁,结合chmlib解压chm文件,周五花了近一天时间,把chm自动化开发完成,小测了一下,速度比预期快很多~。达到一次设计永久使用的目标,不用重构!
关于htmlcxx,可以上github获取,https://github.com/barmi/htmlcxx。windows、linux都可以编译,有现成的编译工程。