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

Posted

技术标签:

【中文标题】使用 c++/boost::regex 提取 HTML 文件的特定部分【英文标题】:Extract specific portion of HTML file using c++/boost::regex 【发布时间】:2012-10-15 23:33:39 【问题描述】:

我有一系列数千个 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 以查找行 &lt;div class="preview_content clearfix module_panel"&gt; 的特定开头时,我没有得到任何火柴。只要是在 c++ 上,我愿意接受任何建议。

【问题讨论】:

必填参考:***.com/a/1732454/1088 【参考方案1】:

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

你没有。

切勿使用正则表达式来处理 HTML。无论是在带有 Boost.Regex 的 C++ 中,还是在 Perl、Python、javascript任何地方中。 HTML 不是常规语言;因此,它不能通过正则表达式以任何有意义的方式处理。哦,在极其有限的情况下,您可能能够获取它来提取一些特定信息。但是一旦这些情况发生变化,您会发现自己无法完成需要完成的工作。

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

【讨论】:

是的,在做了更多阅读之后,我现在发现在处理 html 时使用正则表达式似乎是个坏主意。感谢您指出了这一点。鉴于这是我唯一想做的事情(即获取该特定标签的内容),您建议我使用什么?我一直在环顾四周,但我遇到的大多数事情似乎有点矫枉过正。【参考方案2】:

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

    // 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);

感谢您指出我完全走错了方向。

【讨论】:

以上是关于使用 c++/boost::regex 提取 HTML 文件的特定部分的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中三种正则表达式比较(C regex,C ++regex,boost regex)

boost::string or boost::regex

C++ Boost Regex 不保存捕获

使用 boost::regex 遍历捕获

在 C++ 中使用 boost:regex_error 时未定义符号?

使用 boost::regex 更改文件中数据的格式