Python 在一行中将刮取的数据打印到csv

Python 在一行中将刮取的数据打印到csv,python,python-3.x,csv,web-crawler,Python,Python 3.x,Csv,Web Crawler,运行我的爬虫程序,我可以看到它获取数据,因为它应该,但当谈到打印数据到一个csv文件,它打印在一行。我对python中的类非常陌生,所以我编写的代码中可能会有很多错误,我假设看到了不同的示例。因此,在这一点上,我希望修复单行打印,并使其继续创建新的行。如有任何建议,将不胜感激 import csv import requests from lxml import html class wiseowl: def __init__(self,start_url): self

运行我的爬虫程序,我可以看到它获取数据,因为它应该,但当谈到打印数据到一个csv文件,它打印在一行。我对python中的类非常陌生,所以我编写的代码中可能会有很多错误,我假设看到了不同的示例。因此,在这一点上,我希望修复单行打印,并使其继续创建新的行。如有任何建议,将不胜感激

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)

如果我理解正确,您的代码中已经有了答案,您可以逐行打印出
crawler.storage

只需将写入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运行代码。

感谢Nurzhan提供了如此出色的解决方案。它工作得很好。我会马上接受你的回答。还有一件事需要知道:如果我想从get_link方法到“dunder str”方法使用“name”和“url”,而不是使用“self.storage”,我应该使用self.name和self.url来调用它吗?@SMth80,如果要使用
\uu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu方法中的
self.name
self.url
访问变量
name
url
,则需要在
wiseowl类的构造函数方法
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中将它们声明为实例变量。例如,
self.name=“”
self.url=“”
。但是,由于您处理的是名称和url对的集合,因此您当前的解决方案是好的。您将名称和URL对(即元组)放入
存储
列表中,然后从那里访问它们。希望我能回答你的问题。谢谢你。你几句话的回答节省了我多年的精力。