html正文如何快速提取

上一篇 / 下一篇  2015-09-05 21:27:08 / 个人分类:测试自动化

这几天被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都可以编译,有现成的编译工程。

TAG: HTML html 自动化测试

 

评分:0

我来说两句

日历

« 2024-04-11  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 41749
  • 日志数: 10
  • 建立时间: 2015-08-24
  • 更新时间: 2016-06-21

RSS订阅

Open Toolbar