【问题标题】:Javascript interpreter only being executed on the first pageJavascript 解释器只在第一页执行
【发布时间】:2013-02-08 16:25:36
【问题描述】:

我有以下类可以返回任何给定网页的 HTML:

from PyQt4.QtCore import QUrl, SIGNAL
from PyQt4.QtGui import QApplication
from PyQt4.QtWebKit import QWebPage

from bs4 import BeautifulSoup
from bs4.dammit import UnicodeDammit
import sys
import signal


class Render(QWebPage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.html = None
        signal.signal(signal.SIGINT, signal.SIG_DFL)
        self.connect(self, SIGNAL('loadFinished(bool)'), self._finished_loading)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def _finished_loading(self, result):
        self.html = self.mainFrame().toHtml()
        self.soup = BeautifulSoup(UnicodeDammit(self.html).unicode_markup)
        self.app.quit()   

我有一个循环来遍历需要运行的 JavaScript 的网页列表,例如:

l = ["http://host.com/page1", "http://host.com/page2"]

for page in l:
    soup = Render(page).soup
    #Do-something

问题是 JavaScript 代码仅在加载的第一个页面中执行,之后不解释任何内容。

【问题讨论】:

  • 这可能是因为QWebPage 在发出loadFinished 信号之前没有等待javascript 执行
  • 第一次运行不应该也执行失败吗?
  • 不一定,它可能在您的第一页上加载得足够快,或者可能是 javascript 没有完全呈现
  • @X.Jacobs 我不认为loadFinished 是原因。由于 qt 文档指出:当视图开始加载时会发出 loadStarted() 信号。另一方面,loadProgress() 信号在 Web 视图的元素完成加载时发出,例如嵌入图像、脚本 等。最后,loadFinished() 信号被发出当视图完全加载时。
  • @nymk 是的,脚本可能已加载,但未渲染

标签: python python-2.7 pyqt pyqt4


【解决方案1】:

可能页面已经加载成功,但它有不止一帧。更准确地说,有时page.mainFrame().childFrames() 不是空的。您不仅需要处理主框架,还需要处理其子框架。
例如:

def _finished_loading(self, result):
    self.html = self.mainFrame().toHtml()
    self.soup = BeautifulSoup(UnicodeDammit(self.html).unicode_markup)
    # process childFrames
    self.htmls = [frame.toHtml() for frame in self.mainFrame().childFrames()]
    self.soups = [BeautifulSoup(UnicodeDammit(html).unicode_markup) for html in self.htmls]
    self.app.quit()

【讨论】:

    猜你喜欢
    • 2012-09-10
    • 2015-05-30
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多