繁体   English   中英

无法弄清楚scrapy中的正确循环

[英]Can't figure out the right loop in scrapy

我是新手。

这是我的蜘蛛:

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()

根据你在farmes使用复数,我假设页面上有很多农民。 所以你的表达可能会回归农民的集合。

你可以循环农民的结果并产生每个项目吗?

#pseudocode
hxs = HtmlXPathSelector(response)
farmers = hxs.select('//div[@class="span-24 tx_left"]')
for farmer in farmer:
    item = AmpaItem()
    #be sure to select only one desired farmer here
    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()
    yield item

我通过改变我的管道找到了解决方案:

import csv
import itertools

class CsvWriterPipeline(object):

def __init__(self):
    self.csvwriter = csv.writer(open('items.csv', 'wb'), delimiter=',')

def process_item(self, item, ampa):
    for i,n,k in itertools.izip(item['nome'],item['phone'],item['email']):  
        self.csvwriter.writerow([i,n,k])    
    return item

Thaks DrColossos和dm03514 !!

这是我关于stackoverflow的第一个问题!!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM