2016-11-11 7 views
1

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')) 
+0

QApplication.exec_()は、アプリケーションが終了/中止するまでブロックします。それをinitに入れないでください。 – Trilarion

答えて

0

、多かれ少なかれ期待通りに動作するようです:

は、ここに私のコードです。

あなたが得るQtメッセージは実際に何かの診断ではなく、必ずしも致命的なエラー状態を示すものではありません。だから私はスクリプトが実際にあなたのために正しく働いていると思うし、あなたは単に出力を誤解しているかもしれません。

あなたはすべてのQtメッセージを取り除きたい場合は、(単に輸入の下)スクリプトの先頭に以下の行を置く:

qInstallMsgHandler(lambda *args: None) 

PS:ここでは、正確な出力があります私は得る:

QFont::setPixelSize: Pixel size <= 0 (0) 
QFont::setPixelSize: Pixel size <= 0 (0) 
QNetworkReplyImplPrivate::error: Internal problem, this method must only be called once. 
QFont::setPixelSize: Pixel size <= 0 (0) 
QFont::setPixelSize: Pixel size <= 0 (0) 
http://na.leagueoflegends.com/en/ 
http://na.leagueoflegends.com/en/ 
http://na.leagueoflegends.com/en/news/ 
http://gameinfo.na.leagueoflegends.com/en/game-info/ 
http://nexus.leagueoflegends.com/ 
http://www.lolesports.com/en_US 
http://boards.na.leagueoflegends.com/en/ 
http://ulol.leagueoflegends.com/ 
https://support.riotgames.com/hc/en-us 
https://na.merch.riotgames.com/en/ 
http://na.leagueoflegends.com/en/news/ 
http://gameinfo.na.leagueoflegends.com/en/game-info/ 
http://nexus.leagueoflegends.com/ 
http://www.lolesports.com/en_US 
http://boards.na.leagueoflegends.com/en/ 
http://ulol.leagueoflegends.com/ 
https://support.riotgames.com/hc/en-us 
https://na.merch.riotgames.com/en/ 
http://signup.na.leagueoflegends.com/en 
None 
http://www.lolesports.com/en_US 
http://eu.lolesports.com/en 
http://eu.lolesports.com/pl 
http://eu.lolesports.com/en 
http://eu.lolesports.com/fr 
http://eu.lolesports.com/es 
http://eu.lolesports.com/de 
http://lan.lolesports.com/ 
http://las.lolesports.com/ 
http://lolesports.com.br/ 
http://www.lolespor.com/ 
http://oce.lolesports.com/ 
javascript:; 
javascript:; 
javascript:; 
javascript:; 
+0

答えをありがとう、それは問題ではないことを知ってうれしい(残念ながら私は実際にあなたを笑って十分な評判を持っていない) –

関連する問題