1

私は一連の何千もの HTML ファイルを持っており、単語頻度カウンターを実行するという最終的な目的のために、各ファイルの特定の部分のみに関心があります。たとえば、ファイルの 1 つに次のものが含まれているとします。

<!-- 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 ファイルを開いてコンテンツ全体を 1 つの文字列に読み込むコードがありますが、boost::regex_matchその特定の行頭を探して実行しようとすると<div class="preview_content clearfix module_panel">、一致するものがありません。C ++上にある限り、私はどんな提案にもオープンです。

4

2 に答える 2

1

C ++(boost :: regex)で正規表現を使用して、例で強調表示されているテキストの特定の部分を抽出し、それを別の文字列に入れるにはどうすればよいですか?

あなたはそうしない。

HTMLの処理に正規表現を使用しないでください。Boost.Regexを使用したC++でも、Perl、Python、JavaScriptでも、どこでも。HTMLは正規言語ではありません。したがって、正規表現を介して意味のある方法で処理することはできません。ああ、非常に限られたケースでは、特定の情報を抽出するためにそれを取得できるかもしれません。しかし、これらのケースが変わると、必要なことを実行できなくなることになります。

LibXML2 (HTML4を読み取る機能があります)のような実際のHTMLパーサーを使用することをお勧めします。しかし、正規表現を使用してHTMLを解析することは、単にその仕事に間違ったツールを使用しているだけです。

于 2012-10-16T00:40:26.393 に答える
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);

私が完全に間違った道を進んでいたという事実を指摘していただきありがとうございます。

于 2012-10-16T03:43:53.370 に答える