接收所请求网页的多个 loadFinished 信号

2024-01-12

我收到多个loadFinished当我尝试加载时发出信号QWebPage我不确定是什么导致了这个问题。还有其他几个问题似乎暗示了同一问题,但解决方案对我不起作用:

  • QtWebPage - loadFinished() 多次调用 https://stackoverflow.com/questions/9966433/qtwebpage-loadfinished-called-multiple-times
  • 信号 QWebPage::loadFinished(bool) 返回两次? https://stackoverflow.com/questions/8415289/signal-qwebpageloadfinishedbool-returns-twice

在第一个问题中,答案是将信号连接到插槽一次,”但我已经这样做了。第二个问题的答案表明我应该连接到框架的loadFinished信号,但完成后我根本没有获得必要的数据。

我尝试加载多个页面:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);    

    QList<QUrl> urls;
    urls.append(QUrl("http://www.useragentstring.com/pages/Chrome/"));
    urls.append(QUrl("http://www.useragentstring.com/pages/Firefox/"));
    urls.append(QUrl("http://www.useragentstring.com/pages/Opera/"));
    urls.append(QUrl("http://www.useragentstring.com/pages/Internet Explorer/"));
    urls.append(QUrl("http://www.useragentstring.com/pages/Safari/"));

    foreach(QUrl url, urls)
    {
        UA* ua = new UA();
        QWebPage* page = new QWebPage();
        //QObject::connect(page, SIGNAL(loadFinished(bool)), ua, SLOT(pageLoadFinished(bool)));
        QObject::connect(page->mainFrame(), SIGNAL(loadFinished(bool)), ua, SLOT(frameLoadFinished(bool)));
        // Load the page
        page->mainFrame()->load(url);
    }

    return app.exec();
}

处理信号的类如下所示:

class UA:public QObject
{
    Q_OBJECT
private:
    int _numPageLoadSignals;
    int _numFrameLoadSignals
public:
    UA()
    {
        _numPageLoadSignals = 0;
        _numFrameLoadSignals = 0;
    }
    ~UA(){}
public slots:
    void pageLoadFinished(bool ok)
    {
        _numPageLoadSignals++;

        QWebPage * page = qobject_cast<QWebPage *>(sender());
        if(ok && page)
        {    
            qDebug() << _numPageLoadSignals << " loads " 
                << page->mainFrame()->documentElement().findAll("div#liste ul li a").count()
                << " elements found on: " << page->mainFrame()->requestedUrl().toString();
        }
    }

    void frameLoadFinished(bool ok)
    {
        _numFrameLoadSignals++;
        QWebFrame * frame = qobject_cast<QWebFrame *>(sender());
        if(ok && frame)
        {
            qDebug() << _numFrameLoadSignals << " loads " 
                <<  frame->documentElement().findAll("div#liste ul li a").count()
                << " elements found on: " << frame->requestedUrl().toString();
        }
    }
};

这是仅连接到框架的结果loadFinished signal:

1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Safari/"
1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Chrome/"
1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Opera/"
1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Firefox/"
1  loads  241  elements found on:  "http://www.useragentstring.com/pages/Internet Explorer/"

这是我连接到页面时的结果loadFinished signal:

1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Safari/"
1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Chrome/"
1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Firefox/"
1  loads  0  elements found on:  "http://www.useragentstring.com/pages/Internet Explorer/"
2  loads  576  elements found on:  "http://www.useragentstring.com/pages/Safari/"
2  loads  782  elements found on:  "http://www.useragentstring.com/pages/Chrome/"
2  loads  241  elements found on:  "http://www.useragentstring.com/pages/Internet Explorer/"
2  loads  1946  elements found on:  "http://www.useragentstring.com/pages/Firefox/"
3  loads  241  elements found on:  "http://www.useragentstring.com/pages/Internet Explorer/"
3  loads  1946  elements found on:  "http://www.useragentstring.com/pages/Firefox/"
3  loads  782  elements found on:  "http://www.useragentstring.com/pages/Chrome/"
1  loads  964  elements found on:  "http://www.useragentstring.com/pages/Opera/"
3  loads  576  elements found on:  "http://www.useragentstring.com/pages/Safari/"

我不明白这种行为,为什么有时我得到相关内容,有时却得不到。如果我连接到页面的loadFinished信号,那么我最终会得到内容,但我不知道它什么时候会真正发生。我如何知道我的页面何时真正完成加载?

Update

我假设我的大部分内容将在 3 秒内到达,因此我想出了一个解决方法:我设置了一个计时器事件来发出信号UA::loadFinished第一个后 3 秒loadFinished信号是从接收到的QWebPage。这不是很漂亮,也不是高效的,但它适用于这种情况。


引用QWebPage文档:

最后,当页面内容完全加载时,将发出 loadFinished() 信号,与脚本执行或页面呈现无关。

问题是最后一句话。因此,以下线程中的一些人指出了我认为的问题。

为什么 QWebView.loadFinished 在某些网站上被多次调用,例如YouTube? https://stackoverflow.com/questions/8775152/why-is-qwebview-loadfinished-called-several-times-on-some-sites-e-g-youtube

我一直在努力编写一个爬虫程序,该爬虫程序涉及在幕后使用 javascript 加载内容的页面。多次 loadFinished 是一个问题(我希望它在一切都安顿下来后触发。),但我注意到本质问题是即使在最后一个 loadFinished 激活插槽之后,网页内容可能仍然无法渲染/准备。

因此,我尝试了 QWebPage 类的许多信号,看看它们中的任何一个是否在 loadFinished 信号后持续触发。

找到一个:repaintRequested(QRect)

我不知道这是否一直有效。但是,如果任何内容影响网页的外观,我相信必须调用此信号才能假定页面完整。我既不显示页面,也不使用视图小部件,但信号始终被触发。唯一的问题是它被触发很多次。 (比 loadFinished 频繁得多),因此您需要检查 mainFrame->requestedUrl() 是否与 mainFrame->url() 相同,并且存在您感兴趣的内容的关键字。 (特别是如果您像我一样重用网页。后续请求会更改 requestUrl,而先前加载的 mainFrame 内容仍然存在。那里有一些持久性)

减少要检查的信号数量的一个技巧可能是仅在从 QWebPage 接收到 loadFinished 信号(并可能检查额外条件)后才连接 repaintRequested 。

这可能无法解决无限嵌套加载的问题,因为人们不知道是否有信号是最后一个,但如果您正在搜索内容,那么在加载特定内容后必然会触发信号(我的意思是集成到 DOM 中) :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

接收所请求网页的多个 loadFinished 信号 的相关文章

随机推荐

  • ivot_table 索引中的 NaN 值会导致数据丢失

    这是一个简单的数据框 gt df pd DataFrame a a1 a2 a3 b optional1 None optional3 c c1 c2 c3 d 1 2 3 gt df a b c d 0 a1 optional1 c1 1
  • 所有案例均涵盖 Bresenham 的直线算法 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要检查一行中的所有像素 因此我使
  • 使用 MPI_Gather openmpi c 收集字符串

    我想为每个进程生成一个字符串 然后收集所有内容 但是每个进程中创建的字符串是通过附加整数和字符来创建的 我仍然无法正确收集所有内容 我可以一一打印所有部分字符串 但如果我尝试打印 rcv string 我只会得到一个部分字符串 或者可能会出
  • 将字符串从 EBCDIC 转换为 Unicode / UTF8

    我可以从以下位置发送消息Java to Websphere MQ on AS400 如果我从以下位置发送消息WinXP 如果我使用任何可访问的 没有区别Locale 包括完整的语言本地化 英语也没有问题Locale 对于正确编码来说重要的只
  • 如何使用 ElasticSearch 在字符串字段中搜索精确的短语?

    我想在文档中搜索 社交网络营销 全部一起 但我继续得到单词分开的结果 我有以下 DSL 查询 fields title query bool should match title SEO must match content query M
  • Matplotlib FuncAnimation 只绘制一帧

    我正在尝试使用制作动画FuncAnimation模块 但我的代码只产生一帧然后停止 它似乎没有意识到需要更新什么 你能帮我看看出了什么问题吗 import numpy as np import matplotlib pyplot as pl
  • nginx:无效选项:“off”和entrypoint.sh::权限被拒绝

    我正在使用 Dockerfile 创建构建 然后通过 jenkins 作业部署该构建 映像 但容器状态为 CrashLoopBackOff 当我检查日志时 出现以下错误 Error nginx invalid option off etc
  • Javascript:在settimeout之前调用cleartimeout可以吗?

    我有一个设置计时器的函数 并在计时器到期时回调自身 我想知道的是在函数顶部清除计时器是否是不好的做法 这样做的原因是因为我会不时地异步调用该函数 如果我不先清除计时器 我将同时运行两个计时器 我意识到我可以在对函数进行其他调用之前清除计时器
  • 为什么 Android 上的 RxJava with Retrofit doOnError() 不起作用,而 Subscriber onError 却起作用

    有人可以解释一下为什么这样的代码 networApi getList subscribeOn Schedulers newThread observeOn AndroidSchedulers mainThread doOnError thr
  • 按钮上的图像

    我希望下面的两个脚本有相同的输出 但是当我执行时我没有在按钮上看到图像Script 1 然而 Script 2效果很好 Script 1 from Tkinter import class fe def init self master s
  • enumerate的实现细节是什么?

    Python 有enumerate 使用索引迭代对象 我怀疑解释器创建大量 int 对象的唯一目的是跟踪事物的位置 这政治公众人物页面 http www python org dev peps pep 0279 说了以下内容 但我不太明白幕
  • 获取WIFI信号强度-寻求最佳方法(IOCTL、iwlist(iw)等)

    我想扫描从3个AP接收到的信号强度 如果每 300 毫秒 最多 500 毫秒 发生一次 我会很高兴 我在路由器上刷了 OpenWRT 我正在寻找一个好的工具来做到这一点 首先 我发现 iwconfig 可以工作 但仅限于我连接到的网络 所以
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • Mailchimp - 如何判断用户是否已取消订阅?

    因此 他们点击了时事通讯中的取消订阅链接 在他们的个人资料中 例如 此人于 2017 年 3 月 24 日下午 2 40 取消订阅 收到 时事通讯测试 6 后 很好 但是我如何通过 API 以编程方式判断某人是否已取消订阅呢 有可能吗 我问
  • 使用套接字/内存而不是文件在 Cuda 中解码视频

    我目前正在尝试使用 cuda 解码视频 我有一个名为cudaDecodeD3D9 该示例使用了一种名为cuvidCreateVideoSource它采用指向源视频的文件指针 有没有办法让Cuda从内存 套接字 流加载视频 结果我无法使用cu
  • swift 4:将对象与元组进行模式匹配(元组模式无法匹配非元组类型的值)

    我有一个带有几个字段的自定义结构 我想快速对其进行模式匹配switch语句 以便我可以通过将其中一个字段与正则表达式进行比较来自定义匹配 例如 鉴于此结构 struct MyStruct let header String let text
  • Haskell Parsec,将 oneOf 改编为 [String]

    我正在学习 48 小时内为自己编写一个方案 教程 symbol Parser Char symbol oneOf lt gt 这对于符号来说非常有用 但是如果我有一个关键字列表怎么办 即结构体 整数 oneOf 可以适应列表吗 这就是我想要
  • python side_effect - 方法的模拟行为

    在模拟中 我希望某个函数在测试中返回一个新值 我就是这样做的 Class MyClass my var None def foo self var1 return somevalue def bar self my var foo 1 Cl
  • JDBC 类型没有方言映射:Hibernate 4 和 SQL Server 2012 为 -9 [重复]

    这个问题在这里已经有答案了 我正在使用最新的 Hibernate 4 2 7 SP1 以及实体管理器和验证器等 我正在使用 Microsoft SQL Server 2012 我尝试使用的代码是 StringBuffer sb new St
  • 接收所请求网页的多个 loadFinished 信号

    我收到多个loadFinished当我尝试加载时发出信号QWebPage我不确定是什么导致了这个问题 还有其他几个问题似乎暗示了同一问题 但解决方案对我不起作用 QtWebPage loadFinished 多次调用 https stack