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

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

目录导读

    • 一、通过老北鼻CharGpt 对话 了解到gumbo-parse库
    • 二、过程中所遇到的问题
      • gumbo-parser库是C语言开发的
      • gumbo-query库是C++开发的
      • gumbo-parser 不支持windows环境编译
    • 三、解决问题

一、通过老北鼻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(); }

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(); }

如果你在使用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();
}

这段代码发送了一个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();
}

这段代码创建了一个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. 在主窗口的头文件中包含必要的头文件:
#include 
#include 
  1. 在主窗口的类定义中添加一个QWebEngineView成员:
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);

private:
    QWebEngineView *webView;
};
  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. 编译并运行您的应用程序,将会显示一个包含加载的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. 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();
}

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

QT += webkitwidgets  // for QWebView
或者
QT += webenginewidgets  // for QWebEngineView

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

来自你的消息:
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);
}

你可以通过遍历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
    

    上述命令中,-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; }

上述示例代码首先使用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. 解析HTML文档并创建GumboQueryDocument对象:
GumboOutput* output = gumbo_parse("...");
GumboQueryDocument* doc = gumbo_query_document_new(output);
  1. 使用Gumbo Query选择元素:
GumboQuerySelection* selection = gumbo_query(doc, "selector");

这里的"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);
}

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

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

这样,你就完成了使用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());
    }

你可能感兴趣的:(QT专栏,qt,c++,html)