JavaScriptで読み込まれたBeautifulsoupが解析できないWebページのBeautifulsoupクローラを作成しようとしています。この問題を回避するために、QtWebkitでページをレンダリングするときに、this tutorialに続き、Beautifulsoupで結果のHTMLからページ内のすべてのhrefを抽出しました。PythonのQtWebkitを使ってJavascriptベースのページをレンダリングするQThread:スレッドが実行中に破棄される
しかし、ページスクレイピングは非常に大きく、これらのリンクを取得する前に、「QThread:スレッドが実行中に破棄されました」というエラーがスローされます。多数の人々がこのエラーに関する質問を投稿し、回答を得ましたが、これらはすべて、アプリケーションの中核となるPyQTを持つはるかに複雑なプロジェクトのためのものでしたので、これらの回答はライブラリに精通しており、私の場合に。
スレッドで変数を保存することによってスレッドがガベージコレクションされないようにする必要があるようですが、これを行う正しい方法はわかりません。
は、スクリプトを使用して、明らかに間違っている、と離れていくつかの無害なQtの警告メッセージからは何もありませんimport sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.QtWebKit import *
from bs4 import BeautifulSoup
class Render(QWebPage):
def __init__(self, url):
self.app = QApplication(sys.argv)
QWebPage.__init__(self)
self.loadFinished.connect(self._loadFinished)
self.mainFrame().load(QUrl(url))
self.app.exec_()
def _loadFinished(self, result):
self.frame = self.mainFrame()
self.app.quit()
url = 'http://www.lolesports.com/en_US/msi/msi_2016/schedule/default'
r = Render(url)
result = r.frame.toHtml()
soup = BeautifulSoup(result, "html.parser")
for link in soup.find_all('a'):
print(link.get('href'))
QApplication.exec_()は、アプリケーションが終了/中止するまでブロックします。それをinitに入れないでください。 – Trilarion