使用c ++ / boost :: regex提取HTML文件的特定部分

时间:2012-10-15 23:33:40

标签: c++ regex string boost

我有一系列数千个HTML文件,为了运行字频计数器的最终目的,我只对每个文件的特定部分感兴趣。例如,假设以下是其中一个文件的一部分:

<!-- Lots of HTML code up here -->
<div class="preview_content clearfix module_panel">
      <div class="textelement   "><div><div><p><em>"Portion of interest"</em></p></div>
</div>
<!-- Lots of HTML code down here -->

我应该如何在c ++(boost :: regex)中使用正则表达式来提取示例中突出显示的文本的特定部分并将其放入单独的字符串中?

我目前有一些代码可以打开html文件并将整个内容读入一个字符串,但当我尝试运行boost::regex_match寻找行<div class="preview_content clearfix module_panel">的特定开头时,我不知道得到任何比赛。只要它在c ++上,我就会接受任何建议。

2 个答案:

答案 0 :(得分:1)

  

我应该如何在c ++(boost :: regex)中使用正则表达式来提取示例中突出显示的文本的特定部分并将其放入单独的字符串中?

你没有。

永远不要使用正则表达式来处理HTML。无论是使用Boost.Regex的C ++,还是Perl,Python,JavaScript,任何地方。 HTML不是常规语言;因此,它不能通过正则表达式以任何有意义的方式处理。哦,在非常有限的情况下,你可能能够获取它来提取一些特定的信息。但是一旦这些案例发生变化,你就会发现自己无法完成你需要完成的任务。

我建议使用实际的HTML解析器,例如LibXML2(它有能力读取HTML4)。但是使用正则表达式解析HTML只是使用错误的工具来完成工作。

答案 1 :(得分:1)

由于我所需要的只是非常简单(根据上面的问题),我能够在不使用正则表达式或任何类型的解析的情况下完成它。以下是完成这一操作的代码片段:

    // Read HTML file into string variable str
    std::ifstream t("/path/inputFile.html");
    std::string str((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());

    // Find the two "flags" that enclose the content I'm trying to extract
    size_t pos1 = str.find("<div class=\"preview_content clearfix module_panel\">");
    size_t pos2 = str.find("</em></p></div>");

    // Get that content and store into new string
    std::string buf = str.substr(pos1,pos2-pos1);

感谢您指出我完全走错了路的事实。