2016-06-06 91 views
7

Öğreticilerinde kullandıkları Dmoz web sitesinde Scrapy kullanmak istiyorum, ancak Öğeleri/Alan çiftlerini kullanarak kitap URL'lerindeki (http://www.dmoz.org/Computers/Programming/Languages/Python/Books/) kitapları okumak yerine, oluşturmak istiyorum İstenen değerlerde okuyabilecek bir Öğe Yükleyici (isim, başlık, açıklama).Bir döngü içinde Scrapy Itemloader'ı kullanma

Bu benim items.py dosyasıdır:

from scrapy.item import Item, Field 
from scrapy.contrib.loader import ItemLoader 
from scrapy.contrib.loader.processor import Identity 


class DmozItem(Item): 
    title = Field(
     output_processor=Identity() 
     ) 
    link = Field(
     output_processor=Identity() 
     ) 
    desc = Field(
     output_processor=Identity() 
     ) 


class MainItemLoader(ItemLoader): 
    default_item_class = DmozItem 
    default_output_processor = Identity() 

Ve örümcek dosyası: Farklı alternatifler bir dizi çalıştılar

import scrapy 
from scrapy.spiders import Spider 
from scrapy.loader import ItemLoader 
from tutorial.items import MainItemLoader, DmozItem 
from scrapy.selector import Selector 


class DmozSpider(Spider): 
    name = 'dmoz' 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/" 
    ] 

    def parse(self, response): 
     for sel in response.xpath('//div[@class="site-item "]/div[@class="title-and-desc"]'): 
      l = MainItemLoader(response=response) 
      l.add_xpath('title', '/a/div[@class="site-title"]/text()') 
      l.add_xpath('link', '/a/@href') 
      l.add_xpath('desc', '/div[@class="site-descr "]/text()') 
      yield l.load_item() 

. Ana konunun itemloader deklarasyonunun "response = response" kısmında olduğundan şüpheleniyorum, fakat bununla ilgili scrapy belgelerinin başlarını veya kuyruklarını yapamıyorum. Seçiciyi kullanabilir miyim = "blah" sözdizimi nerede bakmalıyım?

Bunu çalıştırırsam, 22 boş parantezin bir listesini (doğru kitap sayısı) alırım. Her bir add_xpath satırındaki ilk eğik çizgiyi çift eğik çizgi olacak şekilde değiştirirsem, TÜM VERİLERİ içeren 22 aynı listeyi alırım (şaşırtıcı olmayan şekilde).

Bunu nasıl yazabilirim, itemloader her farklı kitap için istenen alanları içeren yeni bir liste yapar?

Teşekkür ederiz!

cevap

11

Belirli bir selektör değil response içerdeki ItemLoader çalışmasına izin gerekir:

l = MainItemLoader(selector=sel) 
l.add_xpath('title', './a/div[@class="site-title"]/text()') 
l.add_xpath('link', './a/@href') 
l.add_xpath('desc', './div[@class="site-descr "]/text()') 
yield l.load_item() 

Ayrıca XPath ifadeleri başında noktalar not edin.

+1

Çok teşekkürler! Çözümün çok basit olduğuna inanamıyorum! Bir takip olarak - bu durumun geçerli olduğuna inanıyorum ama onay için minnettarım: gerçek add_xpath deyiminde regex kullanamazsınız, bunun yerine bir giriş işlemcisi aracılığıyla bununla ilgilenirsiniz, doğru mu? Yine, teşekkürler, bu bir gadfly oldu. –

+2

@PauloBurada, normal ifadeleri kullanmaya devam edebilirsiniz - "re" argümanını kullanın, örnek [burada] (http://doc.scrapy.org/en/latest/topics/loaders.html#scrapy.loader.ItemLoader. add_xpath). – alecxe