gpt4 book ai didi

javascript - 你能用 C++ 加载一个网页,包括 JS 和动态 html 并获得呈现的 DOM 字符串吗?

转载 作者:行者123 更新时间:2023-11-30 05:23:09 25 4
gpt4 key购买 nike

是否可以在 C++ 中加载网页并获取呈现的 DOM?不仅是 HTTP 响应,还有在 java 脚本运行后呈现的 DOM(可能在让它运行一段时间后)。特别是可能随时间变化的动态 HTML?有这方面的图书馆吗?

或者,如果不是 c++,您是否知道可以用其他任何语言完成此操作?

编辑这里有一个例子可以更好地说明为什么要这样做:

假设您想抓取一个用 Angular 编写的网站。你不能只发出http请求并使用HTTP响应,因为大部分DOM是在javascript/dynamic html操作DOM之后呈现的。 Angular 站点的初始 http 响应可能没有所有内容,稍后通过 javascript/AJAX/dyanmic html 请求和呈现。

最佳答案

由于 DOM 是由每个浏览器实现的不同的东西,因此您在 C++ 中使用它的方式将因每个浏览器而异。

我将举一个 IE 的例子。您可以使用 WebBrowser公开 IWebBrowser2 的 ActiveX 控件界面。从那里您可以调用 IWebBrowser2::get_Document 来获取 IHTMLDocument2对象,它是 DOM 的根。

#include "StdAfx.h"

using namespace ATL;
using namespace std;

void ThrowIfFailed(HRESULT hr)
{
if (FAILED(hr))
throw CAtlException(hr);
}

int main()
{
::CoInitialize(nullptr);

try
{
CComPtr<IWebBrowser2> pWebBrowser;
HRESULT hr = ::CoCreateInstance(CLSID_InternetExplorer, nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&pWebBrowser));
ThrowIfFailed(hr);

hr = pWebBrowser->put_Visible(VARIANT_TRUE);
ThrowIfFailed(hr);

hr = pWebBrowser->GoHome();
ThrowIfFailed(hr);

CComPtr<IDispatch> pDispatch;
hr = pWebBrowser->get_Document(&pDispatch);
ThrowIfFailed(hr);

CComPtr<IHTMLDocument2> pDocument;
hr = pDispatch->QueryInterface(&pDocument);
ThrowIfFailed(hr);

CComBSTR bstrTitle;
hr = pDocument->get_title(&bstrTitle);
ThrowIfFailed(hr);

wcout << bstrTitle.m_str << endl;
}
catch (const CAtlException& e)
{
wcout << L"Error (" << hex << e.m_hr << L")" << endl;
}

::CoUninitialize();
return 0;
}

这段代码只是打开一个 IE 窗口,导航到主页,并将页面标题写入控制台。您还可以通过删除对 IWebBrowser2::put_Visible 的调用来控制 IE 窗口是否可见。

关于javascript - 你能用 C++ 加载一个网页,包括 JS 和动态 html 并获得呈现的 DOM 字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39340643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com