QWebEngineView - 加载 > 2mb 的内容
QWebEngineView - loading of > 2mb content
因此,使用 PyQt5 的 QWebEngineView 以及 .setHTML 和 .setContent 方法有 2 MB 的大小限制。在谷歌搜索解决方案时,我发现了两种方法:
使用 SimpleHTTPServer 提供文件。然而,这会被公司使用的防火墙破坏。
使用文件 Urls 并指向本地文件。然而,这是一个相当糟糕的解决方案,因为 HTML 包含机密数据,在任何情况下我都不能将其留在硬盘上。
我目前看到的最佳解决方案是使用文件 url,并在程序 exit/when loadCompleted 报告完成时删除文件,以先到者为准。
但这不是一个很好的解决方案,我想问一下是否有我忽略的更好的解决方案?
为什么不通过自定义 url 方案处理程序 load/link 大部分内容?
webEngineView->page()->profile()->installUrlSchemeHandler("app", new UrlSchemeHandler(e));
class UrlSchemeHandler : public QWebEngineUrlSchemeHandler
{ Q_OBJECT
public:
void requestStarted(QWebEngineUrlRequestJob *request) {
QUrl url = request->requestUrl();
QString filePath = url.path().mid(1);
// get the data for this url
QByteArray data = ..
//
if (!data.isEmpty())
{
QMimeDatabase db;
QString contentType = db.mimeTypeForFileNameAndData(filePath,data).name();
QBuffer *buffer = new QBuffer();
buffer->open(QIODevice::WriteOnly);
buffer->write(data);
buffer->close();
connect(request, SIGNAL(destroyed()), buffer, SLOT(deleteLater()));
request->reply(contentType.toUtf8(), buffer);
} else {
request->fail(QWebEngineUrlRequestJob::UrlNotFound);
}
}
};
然后您可以通过 webEngineView->load(new QUrl("app://start.html"));
加载网站
内部的所有相对路径也将转发到您的 UrlSchemeHandler..
记得添加相应的包含
#include <QWebEngineUrlRequestJob>
#include <QWebEngineUrlSchemeHandler>
#include <QBuffer>
解决此问题的一种方法是使用 requests
和 QWebEnginePage 的方法 runJavaScript
:
web_engine = QWebEngineView()
web_page = web_engine.page()
web_page.setHtml('')
url = 'https://youtube.com'
page_content = requests.get(url).text
# document.write writes a string of text to a document stream
# https://developer.mozilla.org/en-US/docs/Web/API/Document/write
# And backtick symbol(``) is for multiline strings
web_page.runJavaScript('document.write(`{}`);'.format(page_content))
因此,使用 PyQt5 的 QWebEngineView 以及 .setHTML 和 .setContent 方法有 2 MB 的大小限制。在谷歌搜索解决方案时,我发现了两种方法:
使用 SimpleHTTPServer 提供文件。然而,这会被公司使用的防火墙破坏。
使用文件 Urls 并指向本地文件。然而,这是一个相当糟糕的解决方案,因为 HTML 包含机密数据,在任何情况下我都不能将其留在硬盘上。
我目前看到的最佳解决方案是使用文件 url,并在程序 exit/when loadCompleted 报告完成时删除文件,以先到者为准。
但这不是一个很好的解决方案,我想问一下是否有我忽略的更好的解决方案?
为什么不通过自定义 url 方案处理程序 load/link 大部分内容?
webEngineView->page()->profile()->installUrlSchemeHandler("app", new UrlSchemeHandler(e));
class UrlSchemeHandler : public QWebEngineUrlSchemeHandler
{ Q_OBJECT
public:
void requestStarted(QWebEngineUrlRequestJob *request) {
QUrl url = request->requestUrl();
QString filePath = url.path().mid(1);
// get the data for this url
QByteArray data = ..
//
if (!data.isEmpty())
{
QMimeDatabase db;
QString contentType = db.mimeTypeForFileNameAndData(filePath,data).name();
QBuffer *buffer = new QBuffer();
buffer->open(QIODevice::WriteOnly);
buffer->write(data);
buffer->close();
connect(request, SIGNAL(destroyed()), buffer, SLOT(deleteLater()));
request->reply(contentType.toUtf8(), buffer);
} else {
request->fail(QWebEngineUrlRequestJob::UrlNotFound);
}
}
};
然后您可以通过 webEngineView->load(new QUrl("app://start.html"));
内部的所有相对路径也将转发到您的 UrlSchemeHandler..
记得添加相应的包含
#include <QWebEngineUrlRequestJob>
#include <QWebEngineUrlSchemeHandler>
#include <QBuffer>
解决此问题的一种方法是使用 requests
和 QWebEnginePage 的方法 runJavaScript
:
web_engine = QWebEngineView()
web_page = web_engine.page()
web_page.setHtml('')
url = 'https://youtube.com'
page_content = requests.get(url).text
# document.write writes a string of text to a document stream
# https://developer.mozilla.org/en-US/docs/Web/API/Document/write
# And backtick symbol(``) is for multiline strings
web_page.runJavaScript('document.write(`{}`);'.format(page_content))