嗨,我最近开始抓痒,写了一个履带式的。但是,当将数据输出到csv时,它们全部打印在一行中。如何将每个数据打印到自己的行?
我的情况是从网站打印链接。以json格式打印时效果很好。
这是代码。
items.py文件。
import scrapy
from scrapy.item import Item ,Field
class ErcessassignmentItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
link = Field()
#pass
mycrawler.py
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector # deprecated
from scrapy.selector import Selector
from ercessAssignment.items import ErcessassignmentItem
class MySpider(BaseSpider):
name ="ercessSpider"
allowed_domains =["site_url"]
start_urls = ["site_url"]
def parse(self, response):
hxs = Selector(response)
links = hxs.xpath("//p")
items = []
for linkk in links:
item = ErcessassignmentItem()
item["link"] = linkk.xpath("//a/@href").extract()
items.append(item)
return items`
答案 0 :(得分:1)
for linkk in links:
item = ErcessassignmentItem()
item["link"] = xpath("//a/@href").extract()[linkk]
yield item
这在css选择器中效果很好,但是如果以上两种解决方案均无效,那么您可以尝试一下。
答案 1 :(得分:0)
您的上面的代码未print
。此外,我没有看到任何.csv
部分。另外,由于{{1}的第一次迭代之后,您对items
创建的parse()
列表对我来说似乎是缩进错误(即您return
),因此列表永远不会超过1 }}。为了提高可读性,您可以在此处使用for/else构造:
for-loop
答案 2 :(得分:0)
您应该在代码中使用适当的缩进
import scrapy
from scrapy.item import Item ,Field
class ErcessassignmentItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
link = Field()
然后在您的Spider中,不要使用return
,for循环将只运行一次,并且您将仅以CSV打印一行,而使用yield
其次,将代码放入CSV的代码在哪里?我想您正在使用scrapy的默认存储方式,
如果您不知道,请像这样运行刮板
scrapy crawl ercessSpider -o my_output.csv
您的蜘蛛代码应该是这样的,请注意我所做的更改
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector # deprecated
from scrapy.selector import Selector
from ercessAssignment.items import ErcessassignmentItem
class MySpider(BaseSpider):
name ="ercessSpider"
allowed_domains =["site_url"]
start_urls = ["site_url"]
def parse(self, response):
hxs = Selector(response)
links = hxs.xpath("//p")
for linkk in links:
item = ErcessassignmentItem()
item["link"] = linkk.xpath("//a/@href").extract()
yield item