4

私は初心者です。

これは私のスパイダーです:

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

ウェブサイトの各ページには、名前、電話番号、電子メールのリストがあります。上記のコードは、各ページに 3 つの列と 1 つの行を含む csv ファイルを出力します。最初の列の各セルは、そのページ内のすべての名前のリスト、2 番目の列はすべての電話のリスト、3 番目の列はすべての電子メールのリストです。

私が本当にやりたいことは、それぞれの名前、電話番号、電子メールを個別の行に入れることです。各項目をループして実行しようとしましたが、各ページに名前、電話番号、電子メールしか印刷されません。(関数スパイダーがアイテムを返すたびに、コールバックがクローラーを次の URL に移動させるためでしょうか) (そうですか?)

それについてどう思いますか?

ここにアイテムがあります:

from scrapy.item import Item, Field

class AmpaItem(Item):
nome = Field()
phone = Field()
email = Field()
4

2 に答える 2

0

パイプラインを変更して解決策を見つけました:

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

DrColossos さんと dm03514 さん、ありがとうございます!!

これはstackoverflowに関する私の最初の質問でした!!

于 2012-09-14T21:00:27.853 に答える
0

での複数形の使用に基づいて、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
于 2012-09-14T08:48:54.120 に答える