• 使用老北鼻CharGPT对话查询 Qt/C++ 使用gumbo-parse解析加载的html全过程


    记下使用老北鼻CharGPT对话查询 Qt/C++解析html网页全过程。
    [gumbo-parse] Gumbo是HTML5解析算法作为纯C99库实现,没有外部依赖性。它被设计为其他工具和库的构建模块,比如linters、验证器、模板语言、重构和分析工具。详细说明参考original-README.md

    一、通过老北鼻CharGpt 对话 了解到gumbo-parse库

    免费GPT

    来自你的消息:
    Qt库为什么不能加载html

    来自老北鼻AI 的消息:
    Qt库本身是支持加载和显示HTML内容的。你可以使用Qt提供的QWebView或QWebEngineView类来加载和显示HTML页面。

    QWebView类是基于WebKit引擎的,可以加载和显示HTML页面。它提供了一些方法来加载HTML内容,例如load()或setHtml()方法。以下是一个使用QWebView加载HTML页面的示例:

    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QWebView webView;
        webView.setHtml("

    Hello, World!

    "
    ); webView.show(); return app.exec(); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    QWebEngineView类是基于Chromium引擎的,也可以加载和显示HTML页面。同样,它也提供了一些方法来加载HTML内容,例如load()或setHtml()方法。以下是一个使用QWebEngineView加载HTML页面的示例:

    #include  
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QWebEngineView webView;
        webView.setHtml("

    Hello, World!

    "
    ); webView.show(); return app.exec(); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    如果你在使用Qt库加载HTML页面时遇到了问题,可能是由于以下原因之一:

    1. 缺少必要的Qt模块:确保你的项目中包含了正确的Qt模块。对于QWebView,你需要包含QtWebKitWidgets模块;对于QWebEngineView,你需要包含QtWebEngineWidgets模块。

    2. 缺少相关的依赖库:Qt的Web模块可能依赖于某些外部库(例如WebKit或Chromium)。请确保这些依赖库已正确安装,并且在你的项目中正确链接。

    3. Qt版本不兼容:某些特定版本的Qt可能不包含特定的Web模块。请确保你所使用的Qt版本支持加载HTML内容。

    如果你能提供更多关于你遇到问题的具体信息,我可以帮助你更好地解决问题。

    来自你的消息:
    Qt应该怎么访问http请求并获取返回的html界面内容

    来自老北鼻AI 的消息:
    要使用Qt访问HTTP请求并获取返回的HTML页面内容,可以使用Qt的网络模块。Qt提供了两个主要的类来处理网络请求:QNetworkAccessManager和QNetworkRequest。

    首先,你需要创建一个QNetworkAccessManager对象来管理网络请求。然后,你可以使用QNetworkRequest对象来设置请求的URL和其他相关的参数。最后,通过发送请求并接收响应来获取HTML页面的内容。

    以下是一个简单的示例代码,展示了如何使用Qt来获取HTML页面的内容:

    #include 
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        QNetworkAccessManager manager;
        QNetworkRequest request(QUrl("http://example.com")); // 设置请求的URL
    
        QNetworkReply* reply = manager.get(request); // 发送GET请求
    
        QEventLoop loop;
        QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
        loop.exec(); // 等待请求完成
    
        if (reply->error() == QNetworkReply::NoError) {
            QString html = reply->readAll(); // 获取HTML页面内容
            qDebug() << html;
        } else {
            qDebug() << "Error:" << reply->errorString();
        }
    
        reply->deleteLater(); // 释放资源
    
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    这段代码发送了一个GET请求到"example.com"网站,并获取了返回的HTML页面内容。如果请求成功,将打印HTML页面内容;如果请求失败,将打印错误信息。

    注意:在使用这段代码前,需要在.pro文件中添加网络模块的依赖,即在.pro文件中添加QT += network

    希望这个示例代码能帮到你!

    来自你的消息:
    QWebElement 是Qt库吗

    来自老北鼻AI 的消息:
    在早期版本的Qt中,确实有一个名为QWebElement的类,用于处理HTML文档的元素。然而,从Qt 5.5版本开始,QWebElement类已被标记为已弃用,并建议使用Qt WebKit模块中的QWebEngineView类来替代。

    Qt WebKit模块提供了一个基于WebKit引擎的Web浏览器组件,可以用于加载和显示HTML页面。这个模块已经被Qt官方推荐使用,因为WebKit引擎相对于早期的Qt WebKit模块更加现代和强大。

    对于加载和显示HTML页面,你可以使用QWebEngineView类。以下是一个简单的示例代码,展示了如何使用QWebEngineView类加载HTML页面:

    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QWebEngineView view;
        view.setUrl(QUrl("http://example.com")); // 设置要加载的URL
    
        view.show(); // 显示Web浏览器组件
    
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这段代码创建了一个QWebEngineView对象,并通过调用setUrl()方法设置要加载的URL。然后,通过调用show()方法显示Web浏览器组件,最后通过调用a.exec()来启动Qt应用程序的事件循环。

    希望这个示例代码对你有帮助!

    来自你的消息:
    QWebEngineView 需要添加什么模块名

    来自老北鼻AI 的消息:
    要使用QWebEngineView类,您需要在Qt项目中添加Qt WebEngine模块。在Qt中,WebEngine模块是一个单独的模块,需要显式添加到项目中才能使用。您可以按照以下步骤添加Qt WebEngine模块:

    1. 打开项目的.pro文件(Qt项目文件)。
    2. 在文件中找到类似于"QT += …"的行。
    3. 在该行后面添加"webenginewidgets",即"QT += webenginewidgets"。
    4. 保存并重新编译您的项目。

    完成上述步骤后,您就可以在项目中使用QWebEngineView类了。

    来自你的消息:
    webenginewidgets模块中解析html的库名称叫什么

    来自老北鼻AI 的消息:
    在Qt WebEngine模块中,用于解析和呈现HTML页面的库名称是Chromium Embedded Framework(CEF)。Qt WebEngine模块实际上是基于CEF的封装,以便在Qt应用程序中使用。因此,当您使用QWebEngineView类加载和显示HTML页面时,实际上是使用CEF来解析和渲染HTML内容。

    来自你的消息:
    QWebElement 还能用吗

    来自老北鼻AI 的消息:
    从Qt 5.5版本开始,QWebElement类已被标记为已弃用(deprecated)。在Qt WebEngine模块中,推荐使用QWebEngineView类和相关的WebEngine类来加载和操作HTML内容。

    如果您仍然需要使用QWebElement类,可以考虑使用Qt WebKit模块,其中包含了QWebElement类和相关的WebKit类。请注意,Qt WebKit模块在Qt 5.5版本之后也被标记为已弃用,Qt官方推荐使用Qt WebEngine模块来代替。

    总结而言,对于加载和操作HTML内容,建议使用Qt WebEngine模块中的QWebEngineView类和相关类,而不是使用已弃用的QWebElement类。

    来自你的消息:
    WebEngine 怎么使用

    来自老北鼻AI 的消息:
    要使用Qt WebEngine模块加载和显示HTML页面,您可以按照以下步骤进行操作:

    1. 在Qt Creator中创建一个新的Qt Widgets应用程序项目。
    2. 在项目文件(.pro)中添加对WebEngine模块的依赖:
    QT += webenginewidgets
    
    • 1
    1. 在主窗口的头文件中包含必要的头文件:
    #include 
    #include 
    
    • 1
    • 2
    1. 在主窗口的类定义中添加一个QWebEngineView成员:
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = nullptr);
    
    private:
        QWebEngineView *webView;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 在主窗口的构造函数中初始化QWebEngineView,加载并显示HTML页面:
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        webView = new QWebEngineView(this);
        setCentralWidget(webView);
        
        webView->load(QUrl("https://www.example.com")); // 加载指定URL的HTML页面
        webView->show(); // 显示Web视图
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 编译并运行您的应用程序,将会显示一个包含加载的HTML页面的窗口。

    请注意,您需要确保已正确安装了Qt WebEngine模块,并且在项目文件中添加了正确的依赖项。此外,还可以使用QWebEnginePage类来执行更高级的操作,例如JavaScript交互和页面操作。

    这只是一个简单的示例,您可以根据需要进行更多的自定义和功能扩展。

    来自你的消息:
    QT 解析html的库

    来自老北鼻AI 的消息:
    Qt提供了两个类来加载和解析HTML页面:QWebView和QWebEngineView。

    1. QWebView:
      QWebView是基于Webkit引擎的Qt浏览器组件,可以用于加载和显示HTML页面。要使用QWebView,首先需要在Qt项目中包含QtWebKit模块。以下是一个简单的示例代码,演示如何在Qt应用程序中加载HTML页面:
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QWebView webView;
        webView.load(QUrl("http://www.example.com"));
        webView.show();
    
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    1. QWebEngineView:
      QWebEngineView是基于Chromium引擎的Qt浏览器组件,可以加载和渲染HTML页面。要使用QWebEngineView,首先需要在Qt项目中包含QtWebEngineWidgets模块。以下是一个简单的示例代码,演示如何在Qt应用程序中使用QWebEngineView加载HTML页面:
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
    
        QWebEngineView webView;
        webView.setUrl(QUrl("http://www.example.com"));
        webView.show();
    
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    请注意,加载和解析HTML页面可能涉及到网络请求,因此需要确保您的Qt项目已经正确配置了网络访问权限。如果您使用Qt Creator进行开发,可以在项目文件(.pro)中添加以下行来允许网络访问:

    QT += webkitwidgets  // for QWebView
    或者
    QT += webenginewidgets  // for QWebEngineView
    
    • 1
    • 2
    • 3

    希望这个回答对您有帮助!

    来自你的消息:
    C++解析html节点库

    来自老北鼻AI 的消息:
    你可以使用一些第三方库来解析HTML节点,其中比较常用的是libxml2和Gumbo Parser。

    1. libxml2:这是一个功能强大的XML和HTML解析库,可以在C++中使用。它提供了一系列的API来解析和操作HTML节点。你可以从libxml2的官方网站下载并安装该库。以下是一个简单的示例代码,展示如何使用libxml2解析HTML节点:
    #include 
    
    void parseHTML(const char* html) {
        htmlDocPtr doc = htmlReadMemory(html, strlen(html), NULL, NULL, HTML_PARSE_NOWARNING
    
    ==来自你的消息:==
    Gumbo Parser
    
    ==来自老北鼻AI 的消息:==
    Gumbo Parser是另一个流行的HTML解析库,它是用C编写的,并提供了C++绑定。它可以解析HTML,并将其转换为DOM树,以便于遍历和提取节点信息。你可以从Gumbo Parser的GitHub页面下载并使用该库。以下是一个简单的示例代码,展示如何使用Gumbo Parser解析HTML节点:
    
    ```cpp
    #include 
    
    void parseHTML(const char* html) {
        GumboOutput* output = gumbo_parse(html);
        // 遍历DOM树
        // ...
        gumbo_destroy_output(&kGumboDefaultOptions, output);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    你可以通过遍历DOM树的方式来访问和提取HTML节点的信息。例如,你可以使用output->root来获取根节点,然后使用GumboNode结构体的成员来访问节点的标签名、属性和子节点等信息。

    请注意,这只是一个简单的示例代码,你可以根据你的具体需求进行相应的扩展和修改。在使用Gumbo Parser之前,请确保你已经理解和熟悉了它的API和用法。

    来自你的消息:
    gumbo-parser 有windows 版本的吗

    来自老北鼻AI 的消息:
    是的,Gumbo Parser也支持Windows平台。你可以在Gumbo Parser的GitHub页面的发布页面上找到预编译的Windows版本。

    在发布页面中,你可以找到以".zip"或".tar.gz"为扩展名的压缩包,下载并解压缩后,你将找到包含Gumbo Parser库文件的文件夹。在你的C++项目中,你可以将这些库文件添加到你的项目中,并链接它们,以便在Windows平台上使用Gumbo Parser。

    请注意,确保选择与你的C++项目相匹配的Gumbo Parser版本,例如,选择与你的编译器相兼容的版本(32位或64位),并根据你的项目需求选择合适的版本(静态库或动态库)。

    一旦你设置好了Gumbo Parser库,你就可以按照前面提供的示例代码来解析HTML节点了。记得在编译时链接Gumbo Parser库,并将头文件路径添加到你的编译器配置中。

    来自你的消息:
    gumbo-query 编译失败

    来自老北鼻AI 的消息:
    如果你在编译Gumbo Query时遇到了问题,可能是因为缺少依赖项或编译配置不正确。以下是一些可能的解决方案:

    1. 确保你已经正确安装了Gumbo Parser,并将其包含目录和库目录添加到你的编译器配置中。Gumbo Query是建立在Gumbo Parser之上的,所以你需要先正确安装并配置Gumbo Parser。

    2. 检查你的编译器配置是否正确包含了Gumbo Query的源文件和头文件。确保将Gumbo Query的头文件包含到你的源代码中,以便正确使用Gumbo Query的功能。

    3. 检查你的编译器命令是否正确。如果你使用的是GCC或Clang编译器,可以使用类似以下的命令来编译Gumbo Query的源文件:

      g++ -o output_file -I/path/to/gumbo_query/include -L/path/to/gumbo_query/lib source_file.cpp -lgumbo_query
      
      • 1

      上述命令中,-I选项用于指定Gumbo Query的头文件目录,-L选项用于指定Gumbo Query的库目录,-lgumbo_query用于链接Gumbo Query库。

    4. 确保你的编译器支持C++11标准或更高版本。Gumbo Query使用了一些C++11的特性,所以确保你的编译器支持并启用了C++11。

    如果你能提供更详细的编译错误信息,我可能可以给出更具体的解决建议。

    来自你的消息:
    gumbo-parser 用法

    来自老北鼻AI 的消息:
    Gumbo Parser是一个用于解析HTML文档的开源库。它可以将HTML文档解析为一个抽象的DOM树,并提供了一些API来遍历和操作这个DOM树。

    以下是一个简单的示例代码,展示了如何使用Gumbo Parser来解析一个HTML文档:

    #include 
    #include 
    
    // 递归遍历DOM树
    void traverse_node(GumboNode* node) {
        // 如果是文本节点,打印文本内容
        if (node->type == GUMBO_NODE_TEXT) {
            printf("%s\n", node->v.text.text);
        }
        
        // 递归处理子节点
        if (node->type == GUMBO_NODE_ELEMENT) {
            GumboElement* element = &node->v.element;
            for (int i = 0; i < element->children.length; ++i) {
                traverse_node(static_cast<GumboNode*>(element->children.data[i]));
            }
        }
    }
    
    int main() {
        // 创建Gumbo解析器
        GumboOutput* output = gumbo_parse("

    Hello, World!

    "
    ); // 遍历DOM树 traverse_node(output->root); // 释放解析器内存 gumbo_destroy_output(&kGumboDefaultOptions, output); return 0; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    上述示例代码首先使用gumbo_parse函数解析一个HTML文档字符串,返回一个GumboOutput结构体。然后使用traverse_node函数来遍历DOM树,打印文本节点的内容。最后,使用gumbo_destroy_output函数释放解析器的内存。

    请注意,在使用Gumbo Parser之前,你需要正确设置和配置Gumbo Parser库,以便在编译时正确地链接和包含相关的头文件路径。

    来自你的消息:
    Gumbo Query 用法

    来自老北鼻AI 的消息:
    Gumbo Query是Gumbo Parser库的一个扩展,它提供了一种简单的方式来查询和操作解析后的HTML文档。你可以使用Gumbo Query来选择特定的元素、获取其属性值或文本内容,以及进行一些基本的DOM操作。

    首先,确保你已经正确地安装了Gumbo Parser库和Gumbo Query扩展。接下来,你可以按照以下步骤使用Gumbo Query:

    1. 导入所需的库和头文件:
    #include 
    
    • 1
    1. 解析HTML文档并创建GumboQueryDocument对象:
    GumboOutput* output = gumbo_parse("...");
    GumboQueryDocument* doc = gumbo_query_document_new(output);
    
    • 1
    • 2
    1. 使用Gumbo Query选择元素:
    GumboQuerySelection* selection = gumbo_query(doc, "selector");
    
    • 1

    这里的"selector"是你选择元素的CSS选择器表达式。例如,如果你想选择所有的div元素,可以使用"div"作为选择器。你还可以使用类名、ID、属性等进行更具体的选择。

    1. 遍历选择的元素并获取属性或文本内容:
    for (unsigned int i = 0; i < selection->length; ++i) {
        GumboQueryNode* node = selection->data[i];
        // 获取元素的属性值
        const char* attribute_value = gumbo_get_attribute(node->node, "attribute_name");
        // 获取元素的文本内容
        const char* text_content = gumbo_get_text_content(node->node);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在上面的示例中,我们使用了gumbo_get_attribute函数来获取元素的特定属性值,以及gumbo_get_text_content函数来获取元素的文本内容。

    1. 最后,记得释放内存:
    gumbo_destroy_output(&kGumboDefaultOptions, output);
    gumbo_query_selection_destroy(selection);
    gumbo_query_document_destroy(doc);
    
    • 1
    • 2
    • 3

    这样,你就完成了使用Gumbo Query解析和操作HTML文档的基本步骤。

    请注意,使用Gumbo Query之前,你需要正确设置和配置Gumbo Parser库。确保你已经正确地安装了Gumbo Parser库,并在编译时链接所需的库文件。

    希望这些信息对你有帮助!如果你还有其他问题,请随时提问。

    不得不说这个老北鼻CharGpt做的越来越溜了,回答的代码都能直接复制使用了

    二、过程中所遇到的问题

    gumbo-parser库是C语言开发的

    [gumbo-parse]是C语法开发的,Src的文件也不能直接带入C++或qt项目中,不过[gumbo-parse]也提供的C++版本库gumbo-query

    gumbo-query库是C++开发的

    gumbo-query确实是C++开发,Src中的文件也能直接包含进项目中,但是缺少[gumbo-parse]中的部分库文件,而要编译好gumbo-query需要gumbo-parser编译好的库文件

    gumbo-parser 不支持windows环境编译

    [gumbo-parse]在github上的源码只有configure文件没有CMakeLists文件,这就意味着在windows系统上cmake一般是编译不了了。整了大半天这不是扯蛋吗,总不能又重新安装个linux系统 来编译源码。

    三、解决问题

    整个[gumbo-parse]代码量不多,于是我想干脆把[gumbo-parse]项目的部分代码移植到[gumbo-query]上,手动转成C++格式,
    在被一系列的问题整得快要砸电脑的时候,
    突然发现一个大佬已经做好了
    c++解析html
    还整理好直接传github了,好人一生平安
    https://github.com/cejutue/cjhtmlparser
    将源码中gumbo-parser目录下的文件直接以pri的方式带入项目中,正常运行,

    	//char * HTMLS;
    	CDocument doc;
        doc.parse(HTMLS);
    
        CSelection p = doc.find("table");
        qDebug()<<"[code]"<< p.nodeNum();
        for(int i= 0 ;i<p.nodeNum();i++)
        {
            CNode node = p.nodeAt(i);
            qDebug()<<"[code] text: "<<QString::fromUtf8(node.text().c_str());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    【实用干货】如何用LightningChart创建WPF 2D热图?(一)
    Node.js安装记录
    【无标题】右键菜单
    计算机毕设(附源码)JAVA-SSM基于驾校管理系统
    Qt基于Qml向左边滑动删除列表项
    java ssm+python儿童疫苗接种提醒系统e6lhv
    第7章 函数--C++的编成模块
    【SpringSecurity】SpringSecurity2.7.x 的使用(02)
    数据结构-快速排序
    React源码分析2-深入理解fiber
  • 原文地址:https://blog.csdn.net/qq_35554617/article/details/134192720