Phân Tích Cú Pháp HTML

C++:
Phân Tích Cú Pháp HTML

Cách thức:

C++ không đi kèm với khả năng phân tích cú pháp HTML được tích hợp sẵn. Bạn thường sẽ sử dụng một thư viện như Gumbo-parser của Google, hoặc một cái gì đó tương tự. Dưới đây là một ví dụ nhanh sử dụng 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'>Liên kết</a></body></html>";
    GumboOutput* output = gumbo_parse(html);
    search_for_links(output->root);
    gumbo_destroy_output(&kGumboDefaultOptions, output);
    return 0;
}

Kết quả mẫu:

https://example.com

Sâu hơn

Việc phân tích cú pháp HTML không luôn luôn là điều dễ dàng trong C++. Trước đây, các lập trình viên sẽ sử dụng regex hoặc các trình phân tích cú pháp do chính họ viết, cả hai đều dễ phạm lỗi và cồng kềnh. Ngày nay, các thư viện mạnh mẽ như Gumbo-parser xử lý những phức tạp của việc phân tích cú pháp, làm cho nó dễ dàng và đáng tin cậy hơn.

Các lựa chọn thay thế bao gồm Tidy, MyHTML, hoặc thậm chí tích hợp C++ với BeautifulSoup của Python thông qua hàm system của C++ hoặc các bộ thông dịch nhúng.

Về mặt triển khai, các thư viện này chuyển đổi HTML thành một cây Mô hình Đối tượng Tài liệu (DOM). Duyệt và thao tác DOM cho phép người dùng trích xuất và làm việc với dữ liệu như đã trình bày trong phần Cách thức.

Xem thêm