【发布时间】:2012-09-15 05:00:27
【问题描述】:
我是新手。
这是我的蜘蛛:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from ampa.items import AmpaItem
class AmpaSpider(CrawlSpider):
name = "ampa"
allowed_domains = ['website']
start_urls = ['website/page']
rules = (Rule(SgmlLinkExtractor(allow=('associados?', ), deny=('associado/', )), callback='parse_page', follow=True),)
def parse_page(self, response):
hxs = HtmlXPathSelector(response)
item = AmpaItem()
farmers = hxs.select('//div[@class="span-24 tx_left"]')
item['nome'] = farmers.select('//div/h3[@class="titulo"]/a/text()').extract()
item['phone'] = farmers.select('//div/span[@class="chamada"]/a[contains(text(), "Telefone")]/text()').extract()
item['email'] = farmers.select('//div/span[@class="chamada"]/a[contains(text(), "E-mail")]/text()').extract()
print item.values()
return item
这是我的管道:
class CsvWriterPipeline(object):
def __init__(self):
self.csvwriter = csv.writer(open('items.csv', 'wb'))
def process_item(self, item, ampa):
self.csvwriter.writerow([item['nome'], item['phone'], item['email']])
return item
网站的每个页面都有一个姓名、电话和电子邮件列表。上面的代码将输出一个 csv 文件,每页包含三列和一行。在第一列中,每个单元格是该页面中所有姓名的列表,在第二列中,它们是所有电话的列表,在第三列中,它们是所有电子邮件的列表。
我真正想做的是将每个姓名、电话和电子邮件放在单独的行中。我尝试通过循环遍历每个项目来做到这一点,但它只打印名字,每个页面上的电话和电子邮件。 (是不是因为每次函数蜘蛛返回一个项目时,回调将爬虫移动到下一个URL)(是吗???)
你会怎么做呢?
这是项目:
from scrapy.item import Item, Field
class AmpaItem(Item):
nome = Field()
phone = Field()
email = Field()
【问题讨论】:
-
你能打印出
item在process_item函数中的内容吗?它看起来根本不应该是电子邮件列表... -
在您的电子表格查看器中,您是否确保以“,”作为分隔符打开 csv?
-
您好 dm03514,我使用了分隔符,但它仍然无法分隔项目。
-
你能在保存之前发布一个示例
item,当它在process_item中时?