C++:
HTMLの解析

方法:

C++には組み込みのHTMLパース機能がありません。GoogleのGumbo-parserや同様のライブラリを使用することがよくあります。以下はGumbo-parserを使用した簡単な例です:

#include <iostream>
#include <gumbo.h>

void search_for_links(GumboNode* node) {
    if (node->type != GUMBO_NODE_ELEMENT) {
        return;
    }
    if (node->v.element.tag == GUMBO_TAG_A) {
        GumboAttribute* href = gumbo_get_attribute(&node->v.element.attributes, "href");
        if (href) {
            std::cout << href->value << std::endl;
        }
    }
    GumboVector* children = &node->v.element.children;
    for (unsigned int i = 0; i < children->length; ++i) {
        search_for_links(static_cast<GumboNode*>(children->data[i]));
    }
}

int main() {
    const char* html = "<html><body><a href='https://example.com'>Link</a></body></html>";
    GumboOutput* output = gumbo_parse(html);
    search_for_links(output->root);
    gumbo_destroy_output(&kGumboDefaultOptions, output);
    return 0;
}

サンプル出力:

https://example.com

掘り下げ

C++でのHTMLパースは常に簡単でしたというわけではありません。歴史的に、プログラマは正規表現や手書きのパーサーを使用していましたが、どちらもエラーが発生しやすく、面倒です。現在では、Gumbo-parserのような堅牢なライブラリがパースの微妙なところを処理してくれるため、より簡単で信頼性が高くなりました。

代替手段には、Tidy、MyHTML、あるいはC++のsystem関数や組み込みインタプリタを介してPythonのBeautifulSoupとの統合も含まれます。

実装において、これらのライブラリはHTMLをドキュメントオブジェクトモデル(DOM)ツリーに変換します。「方法」セクションで示されたように、DOMを走査し操作することで、ユーザーはデータを抽出し作業することができます。

参照