2017-05-11 64 views
0

運行我的抓取程序我可以看到它應該按照它應該抓取的數據,但是當它將數據打印到csv文件時,它會將其打印在一行中。我很興奮能夠在python中使用類,所以我的代碼中可能會出現很多錯誤,這些代碼我假設已經看到了不同的例子。所以,在這一點上,我希望解決單行打印問題,並使其不斷創建新行。任何建議將不勝感激。刮掉的數據打印到單行的csv

import csv 
import requests 
from lxml import html 

class wiseowl: 
    def __init__(self,start_url): 
     self.start_url=start_url 
     self.storage=[] 

    def crawl(self): 
     self.get_link(self.start_url) 


    def get_link(self,link): 
     response=requests.get(link) 
     tree=html.fromstring(response.text) 
     titles=tree.xpath("//p[@class='woVideoListDefaultSeriesTitle']") 
     for title in titles: 
      name=title.xpath(".//a/text()")[0] 
      urls=title.xpath(".//a/@href")[0] 
      Docs=(name,urls) 
      self.storage.append(Docs) 


    def writing_csv(self): 
     with open("Wiseowl.csv","w",newline="") as f: 
      writer=csv.writer(f) 
      writer.writerow(["Title","Link"]) 
      writer.writerow(self.storage) 


    def __str__(self): 
     return "{}".format(self.storage) 


crawler=wiseowl("http://www.wiseowl.co.uk/videos/") 
crawler.crawl() 
crawler.writing_csv() 
for item in crawler.storage: 
    print(item) 

回答

1

如果我理解正確的,你,你已經在你的代碼,你通過在線打印出crawler.storage行了答案。

方法writing_csv就改成這樣:

def writing_csv(self): 
    with open("Wiseowl.csv","w",newline="") as f: 
     writer=csv.writer(f) 
     writer.writerow(["Title","Link"]) 

     for item in self.storage: 
      writer.writerow(item) 

當您使用writer.writerow(self.storage)writerow認爲self.storage作爲一個線串的方法。這就是爲什麼它將它作爲一行存儲在文件中的原因。

注意我使用python3運行代碼。

+0

謝謝Nurzhan,爲了這樣一個美妙的解決方案。它工作完美。有一段時間會接受你的回答。還有一件事要知道:如果我想使用get_link方法中的「name」和「urls」替換「self.storage」而不是使用「dunder str」方法,應該使用self.name和self.urls調用它嗎? – SIM

+1

@ SMth80,如果你想在'__str__'方法中使用'self.name'和'self.urls'訪問變量'name'和'urls',那麼你需要在構造方法中聲明它們爲實例變量你的'智能類'的'__init__'。例如,'self.name =「」'和'self.urls =「」'。但是,既然你處理了一個名稱和url對的集合,那麼你現在的解決方案是好的。你把你的名字和url(它們是元組)放到'storage'列表中,然後從那裏訪問它們。希望我回答你的問題。 – Nurjan

+0

謝謝萬億。用幾行的答案挽救了我多年的努力。 – SIM