Javascript解释器只在第一个pag上执行

2024-09-28 20:43:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下类,可以将给定网页的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遍历需要运行的网页列表,例如:

^{pr2}$

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


Tags: fromimportselfapp网页signalhtmlpyqt4
1条回答
网友
1楼 · 发布于 2024-09-28 20:43:47

可能页面已成功加载,但它有多个框架。更准确地说,有时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()

相关问题 更多 >