2017-05-28 14 views
-1

私は、JavaScriptで生成されたコンテンツを含むウェブサイトの複数のページからいくつかのデータを抽出しようとしています。 私はPyQt4とBeautiful Soupを使ってページをループし、いくつかのデータフィールドを抽出しています。PyQt4と美味しいスープを使ってページをループする

import sys 
from bs4 import BeautifulSoup 
from PyQt4.QtGui import QApplication 
from PyQt4.QtCore import QUrl 
from PyQt4.QtWebKit import QWebPage 


class Client(QWebPage): 

    def __init__(self, url): 
     self.app = QApplication(sys.argv) 
     QWebPage.__init__(self) 
     self.loadFinished.connect(self.on_page_load) 
     self.mainFrame().load(QUrl(url)) 
     self.app.exec_() 

    def on_page_load(self): 
     self.app.quit() 

products_titles = [] 
urls= ['url1', 'url2', 'url3'] 

for url in urls: 
    print "Parsing URL: " + url + '\n' 
    client_response = Client(url) 
    source = client_response.mainFrame().toHtml() 
    soup = BeautifulSoup(source, "html.parser") 
    print get_product_category(soup) 

しかし、私はそれがこのエラーを押しつぶすとなります実行します。

QObject::connect: Cannot connect (null)::configurationAdded(QNetworkConfiguration) to QNetworkConfigurationManager::configurationAdded(QNetworkConfiguration) 
QObject::connect: Cannot connect (null)::configurationRemoved(QNetworkConfiguration) to QNetworkConfigurationManager::configurationRemoved(QNetworkConfiguration) 
QObject::connect: Cannot connect (null)::configurationChanged(QNetworkConfiguration) to QNetworkConfigurationManager::configurationChanged(QNetworkConfiguration) 
QObject::connect: Cannot connect (null)::onlineStateChanged(bool) to QNetworkConfigurationManager::onlineStateChanged(bool) 
QObject::connect: Cannot connect (null)::configurationUpdateComplete() to QNetworkConfigurationManager::updateCompleted() 
[1] 14809 segmentation fault python products.py 

私は私が間違ってやってるんだかわからないあなたが起こって何を知っていれば、助けてください。

答えて

1

URLのリストを送信し、QApplicationのインスタンスを1つだけロードして、一連のQApplicationsをインスタンス化して破棄するのではなく、順次ロードします。言い換えれば

はもっとこのような何かをしようと... QApplicationsの束を再インスタンス

import sys 
from bs4 import BeautifulSoup 
from PyQt4.QtGui import QApplication 
from PyQt4.QtCore import QUrl, pyqtSignal 
from PyQt4.QtWebKit import QWebPage 

class Client(QWebPage): 

    new_url = pyqtSignal(['QString'], name='new_url') 

    def __init__(self, urls): 
     self.app = QApplication(sys.argv) 
     self.urls = urls 
     self.pages = dict() 
     QWebPage.__init__(self) 
     self.new_url.connect(self.load_url) 
     self.loadFinished.connect(self.on_page_load) 
     if len(self.urls): 
      self.new_url.emit(urls.pop()) 
     self.app.exec_() 

    def load_url(self, url): 
     self.current_url = url 
     print "Loading: {0}".format(url) 
     self.mainFrame().load(QUrl(url)) 

    def on_page_load(self): 
     print "Retrieved: {0}".format(self.current_url) 
     self.pages[self.current_url] = unicode(self.mainFrame().toHtml()) 
     if len(self.urls): 
      self.new_url.emit(self.urls.pop()) 
     else: 
      self.app.quit() 

urls= ['http://www.google.com', 'http://www.yahoo.com', 'http://www.bing.com'] 

client = Client(urls) 
for (url, page) in client.pages.items(): 
    soup = BeautifulSoup(page, "html.parser") 
    print "{0}\t{1}".format(url, soup.title.text) 

は本当に悪いアイデアのように思えるし、私はそのコンテキストでセグメンテーションフォールトを理解することができます。セグメンテーションフォールトの前のネットワークエラーはちょっと奇妙に思えます。あなたはそれでより良い運がある場合、上記を試してみてください。それは私のためにうまくいきます。

+0

ありがとうございます。私の解決策よりもうまく機能しています。 – melhirech

関連する問題