2016-06-06 5 views
7

मैं उनके ट्यूटोरियल में उपयोग की जाने वाली डीएमओज़ वेबसाइट पर स्केपर का उपयोग करना चाहता हूं, लेकिन आइटम/फ़ील्ड जोड़े का उपयोग करके पुस्तकें यूआरएल (http://www.dmoz.org/Computers/Programming/Languages/Python/Books/) में किताबें पढ़ने की बजाय, मैं बनाना चाहता हूं एक आइटमलोडर जो वांछित मानों (नाम, शीर्षक, विवरण) में पढ़ेगा।लूप में स्केपर आइटमलोडर का उपयोग

यह मेरा items.py फ़ाइल है:

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

और मेरी मकड़ी फ़ाइल:

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

मैं अलग विकल्प के एक नंबर की कोशिश की है। मुझे संदेह है कि मुख्य मुद्दा आइटम लोडर घोषणा के "प्रतिक्रिया = प्रतिक्रिया" भाग में है, लेकिन मैं इसके बारे में स्केपर दस्तावेज के सिर या पूंछ नहीं बना सकता। चयनकर्ता = "ब्लाह" वाक्यविन्यास का उपयोग कर सकते हैं जहां मुझे देखना चाहिए?

यदि मैं इसे चलाता हूं, तो मुझे 22 खाली ब्रैकेट्स (पुस्तकों की सही संख्या) की एक सूची मिलती है। यदि मैं डबल स्लैश होने के लिए प्रत्येक add_xpath लाइन में पहला स्लैश बदलता हूं, तो मुझे 22 समान सूचियां मिलती हैं जिनमें सभी डेटा (असुरक्षित रूप से) होते हैं।

मैं इसे कैसे लिख सकता हूं ताकि आइटम लोडर प्रत्येक अलग पुस्तक के लिए वांछित फ़ील्ड वाली एक नई सूची बना सके?

धन्यवाद!

उत्तर

11

आप एक विशिष्ट चयनकर्ता, response नहीं अंदर अपने ItemLoader काम करने देने के लिए की जरूरत है:

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

इसके अलावा xPath अभिव्यक्ति की शुरुआत में डॉट्स ध्यान दें।

+1

बहुत बहुत धन्यवाद! मुझे विश्वास नहीं है कि समाधान इतना आसान था! अनुवर्ती के रूप में - मेरा मानना ​​है कि यह मामला है लेकिन मैं पुष्टि की सराहना करता हूं: आप वास्तविक add_xpath कथन में रेगेक्स का उपयोग नहीं कर सकते हैं, बल्कि आप इनपुट प्रोसेसर के माध्यम से उस से निपट सकते हैं, सही? दोबारा, धन्यवाद, यह इतनी गड़बड़ी है। –

+2

@PauloBlack सुनिश्चित करें, आप अभी भी नियमित अभिव्यक्तियों का उपयोग कर सकते हैं - 'पुनः' तर्क, नमूना [यहां] (http://doc.scrapy.org/en/latest/topics/loaders.html#scrapy.loader.ItemLoader का उपयोग करें। add_xpath)। – alecxe

संबंधित मुद्दे