1

特定の Web ページの 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 を使用して WebPages のリストを反復処理するループがあります。

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

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

問題は、読み込まれた最初のページでのみ JavaScript コードが実行され、その後は解釈されないことです。

4

1 に答える 1

0

おそらくページは正常に読み込まれましたが、複数のフレームがあります。より正確に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()
于 2013-02-08T19:27:11.833 に答える