2014-02-26 90 views
0

我在教自己的面向對象的python編程。我正在使用一個基本的GUI和一個簡單的Web解析器 - 它們都在單獨的類文件中。我的目標是從GUI調用Web解析器。從GUI調用web解析器python

我的web分析器類只是下載一個頁面並將其存儲爲列表。當我在GUI上按下一個按鈕時,我想要一個簡單的網頁打印輸出。除了我遇到問題。當我點擊按鈕時,它聲明我的'解析器'名稱沒有被定義。我開始有點困惑。如果有人能讓我知道這很好。謝謝。

我的網絡分析器:

from BeautifulSoup import BeautifulSoup 
import urllib2 

class Parser(object): 

    def __init__(self, url):  
     self.url = url 
     self.contents = '' 

    def download_page(self): 

     #open the page 
     page=urllib2.urlopen(self.url) 
     soup = BeautifulSoup(page.read()) 

     page_find=soup.findAll('td') 

     #lists for storing page data 
     page_list = [] 

     #Store HTML table data into list 
     for page_data in page_find: 
      page_list.append(page_data.string) 

     return page_list 



if __name__ == '__main__': 
    url = "http://www.any_url" 
    Parser = Parser(url) 
    print Parser.download_page() 

我的GUI類如下:

class Example(QtGui.QMainWindow): 

def __init__(self): 
    super(Example, self).__init__() 

    #Made changes here 
    self.url = url 
    self.parser = Parser(url) 
    self.initUI() 

def initUI(self):  

    parse_list = []  

    btn1 = QtGui.QPushButton("Button 1", self) 
    btn1.move(30, 50) 

    btn1.clicked.connect(self.buttonClicked)    
    self.statusBar() 

    self.setGeometry(300, 300, 290, 150) 
    self.show() 



#supposed to call web parser when button is pressed 
def buttonClicked(self): 

    parse_list = parser.download_page() 
    print parse_list 
    sender = self.sender() 
    self.statusBar().showMessage(sender.text() + ' was pressed') 


def main(): 

    app = QtGui.QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 

如果 == '主要': 的main()

+0

看起來像一個示波器問題,'parser'包含在'initUI()'中。在你調用'buttonClicked()'的時候已經消失了。 –

+0

@RedAlert我將parser = Parser(object)移動到了buttonClicked()中,但得到了錯誤:TypeError:無法設置內置/擴展類型對象的屬性 – David

+0

爲什麼你傳入'object'?重點是什麼? –

回答

2
parse_list = parser.download_page  

應該是

parse_list = parser.download_page() 

圓括號告訴Python調用該方法。沒有括號,parser.download_page引用方法對象本身。 Python中的函數是first-class objects


要解決的NameError問題,請parser實例屬性中initUI

self.parser = Parser(url) 

,然後在buttonClicked

parse_list = self.parser.download_page() 

引用它。 (顯然,你需要定義url。)

+0

進行了更改,但仍得到相同的錯誤:沒有定義全局名稱'parser' – David

+0

進行了上述更改,但現在我得到:全局名稱'url'未定義。我在構造函數中完成了它。我想我以某種方式做錯了。 – David

+0

只需跟進。你有答案嗎? – David