接受或删除 Cookie 关于使用 PyQt5 QtWebEngineWidgets 将 HTML 转换为 PDF 的通知

Posted

技术标签:

【中文标题】接受或删除 Cookie 关于使用 PyQt5 QtWebEngineWidgets 将 HTML 转换为 PDF 的通知【英文标题】:Accept or Remove Cookies Notice on converting HTML to PDF with PyQt5 QtWebEngineWidgets 【发布时间】:2021-07-13 14:42:17 【问题描述】:

我已成功将 html 转换为 PDF(或打印为 pdf)。但是,Cookies 和隐私政策通知打印在每页的底部。 如何删除此通知或接受 cookie? (任何网站域的解决方案)

import os
import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets


def html_to_pdf(html, pdf):
    app = QtWidgets.QApplication(sys.argv)

    page = QtWebEngineWidgets.QWebEnginePage()

    def handle_print_finished(filename, status):
        print("finished", filename, status)
        QtWidgets.QApplication.quit()

    def handle_load_finished(status):
        if status:
            page.printToPdf(pdf)
        else:
            print("Failed")
            QtWidgets.QApplication.quit()

    page.pdfPrintingFinished.connect(handle_print_finished)
    page.loadFinished.connect(handle_load_finished)
    page.setUrl(QtCore.QUrl(html))
    app.exec_()


if __name__ == "__main__":
    html_to_pdf("https://***.com/questions/2530/how-do-you-disable-browser-autocomplete-on-web-form-field-input-tag?rq=1", "test.pdf")

【问题讨论】:

【参考方案1】:

一种可能的解决方案是实现一个点击按钮的 Js 脚本,如下例所示:

import os
import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets


def html_to_pdf(html, pdf):
    app = QtWidgets.QApplication(sys.argv)

    page = QtWebEngineWidgets.QWebEnginePage()

    def handle_print_finished(filename, status):
        print("finished", filename, status)
        QtWidgets.QApplication.quit()

    def handle_load_finished(status):
        if status:
            execute_js()
        else:
            print("Failed")
            QtWidgets.QApplication.quit()

    def handle_run_js(status):
        if status:
            QtCore.QTimer.singleShot(1000, print_pdf)
        else:
            QtCore.QTimer.singleShot(1000, execute_js)

    def execute_js():
        page.runjavascript(
            """
            (function () 
                var elements = document.getElementsByClassName("js-consent-banner-hide")
                if(elements.length > 0)
                    elements[0].click()
                    return true;
                
                return false;
            )();
            """,
            handle_run_js,
        )

    def print_pdf():
        page.printToPdf(pdf)

    page.pdfPrintingFinished.connect(handle_print_finished)
    page.loadFinished.connect(handle_load_finished)
    page.setUrl(QtCore.QUrl(html))
    app.exec_()


if __name__ == "__main__":
    html_to_pdf(
        "https://***.com/questions/2530/how-do-you-disable-browser-autocomplete-on-web-form-field-input-tag?rq=1",
        "test.pdf",
    )

【讨论】:

此解决方案有效,但仅适用于 *** 域。它对我部分有用,谢谢!任何网站的通用解决方案的任何想法? QtWebEngineWidgets 可以自动接受/忽略所有 cookie 吗? @AlexandreStrapacaoG.Vianna 没有通用方法,因为出于安全原因,您必须单击该按钮。如果您在类中找到按钮或按钮名称,那么您可以应用我的解决方案。 知道了! @eyllanesc 出了点问题,现在我收到此错误消息:js:与yahoo.com 的跨站点资源关联的 cookie 设置为没有 SameSite 属性。如果设置了SameSite=NoneSecure,Chrome 的未来版本将只提供带有跨站点请求的cookie。您可以在应用程序>存储>Cookies 下的开发人员工具中查看 cookie,并在 chromestatus.com/feature/5088147346030592 和 chromestatus.com/feature/5633521622188032 查看更多详细信息。 js:与everesttech.net 的跨站点资源关联的 cookie 被设置为 w...

以上是关于接受或删除 Cookie 关于使用 PyQt5 QtWebEngineWidgets 将 HTML 转换为 PDF 的通知的主要内容,如果未能解决你的问题,请参考以下文章

关于cookie(会话cookie与持久cookie)

关于Cookie的知识的总结

如何在 Objective-C 中要求用户接受或拒绝 WKWebView 网站的 cookie

Safari 不接受 Cookie 而 FF 和 IE 接受

如何使 Pyqt5 QLineEdit 只接受数字

如何使用 PHP 或 JS 使用 HttpOnly 删除 cookie