C++:
Analiza składniowa HTML

Jak to zrobić:

C++ nie posiada wbudowanych możliwości parsowania HTML. Często używa się do tego biblioteki, takiej jak Gumbo-parser od Google’a, lub czegoś podobnego. Oto krótki przykład użycia 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* dzieci = &node->v.element.children;
    for (unsigned int i = 0; i < dzieci->length; ++i) {
        search_for_links(static_cast<GumboNode*>(dzieci->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;
}

Przykładowe wyjście:

https://example.com

Dogłębna analiza

Parsowanie HTML nigdy nie było prostym zadaniem w C++. Historycznie, programiści używali wyrażeń regularnych lub pisanych ręcznie parserów, obie metody są podatne na błędy i uciążliwe. Obecnie, solidne biblioteki takie jak Gumbo-parser zajmują się zawiłościami parsowania, czyniąc je łatwiejszym i bardziej niezawodnym.

Do alternatyw należą Tidy, MyHTML, czy nawet integracja C++ z Pythonowym BeautifulSoup za pośrednictwem funkcji system w C++ lub wbudowanych interpreterów.

Pod względem implementacji, te biblioteki konwertują HTML na drzewo modelu obiektowego dokumentu (DOM). Przechodzenie i manipulowanie DOM pozwala użytkownikom na wyodrębnianie i pracę z danymi, jak pokazano w sekcji Jak to zrobić.

Zobacz też