2017-05-28 3 views
-1

Ich versuche, Daten aus mehreren Seiten einer Website mit Inhalten zu extrahieren, die mit Javascript erstellt wurden. Also benutze ich PyQt4 zu und Schöne Suppe, um Seiten zu durchlaufen und einige Datenfelder zu extrahieren.Durchblättern von Seiten mit PyQt4 und Beautiful Soup

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) 

Aber wenn ich es zermalmt laufen und gibt diesen Fehler:

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 

Ich weiß nicht, was ich bin ich falsch mache, bitte helfen Sie, wenn Sie wissen, was los ist.

Antwort

1

Ich würde eine Liste von URLs einsenden und eine einzelne Instanz Ihrer QApplication nacheinander laden lassen, anstatt eine Menge QApplications zu instantiieren und zu zerstören.

Mit anderen Worten versuchen, etwas mehr wie dieser ...

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) 

ein Bündel von QApplications Reinstantiating wie eine wirklich schlechte Idee scheint und ich kann in diesem Zusammenhang einen Segmentation Fault verstehen. Die Netzwerkfehler vor dem Segmentierungsfehler erscheinen mir allerdings etwas merkwürdig. Versuchen Sie das oben genannte und sehen Sie, ob Sie mehr Glück damit haben. Es funktioniert gut für mich.

+0

Vielen Dank es funktioniert gut und viel schneller als meine Lösung !! – melhirech

Verwandte Themen