2016-10-30 6 views
1

Ich versuche ItemLoader zu verwenden drei Elemente in einem Array wie folgt zu kombinieren:Scrapy ItemLoader Artikel kombiniert

[ 
    { 
     site_title: "Some Site Title", 
     anchor_text: "Click Here", 
     link: "http://example.com/page" 
    } 
] 

Wie Sie in der unten stehenden JSON sehen können, ist es alle Elemente eines Typs zusammen zu kombinieren.

Wie sollte ich damit umgehen, um ein JSON mit Arrays wie ich suche ausgeben?

Spinne Datei:

import scrapy 
from linkfinder.items import LinkfinderItem 
from scrapy.loader import ItemLoader 

class LinksSpider(scrapy.Spider): 
    name = "links" 
    allowed_domains = ["wpseotest.com"] 
    start_urls = ["https://wpseotest.com"] 

    def parse(self, response): 

     l = ItemLoader(item=LinkfinderItem(), response=response) 
     l.add_xpath('site_title', '//title/text()') 
     l.add_xpath('anchor_text', '//a//text()') 
     l.add_xpath('link', '//a/@href') 
     return l.load_item() 

     pass 

Items.py

import scrapy 
from scrapy import item, Field 

class LinkfinderItem(scrapy.Item): 
    # define the fields for your item here like: 
    # name = scrapy.Field() 
    site_title = Field() 
    anchor_text = Field() 
    link = Field() 
    pass 

JSON Ausgabe

[ 
{"anchor_text": ["Globex Corporation", "Skip to content", "Home", "About", "Globex News", "Events", "Contact Us", "3999 Mission Boulevard,\r", "San Diego, CA 92109", "This is a test scheduled\u00a0post.", "Test Title", "Globex Subsidiary Ice Cream Inc. Creates Chicken Wing\u00a0Flavor", "Globex Inc.", "\r\n", "Blog at WordPress.com."], "link": ["https://wpseotest.com/", "#content", "https://wpseotest.com/", "https://wpseotest.com/about/", "https://wpseotest.com/globex-news/", "https://wpseotest.com/events/", "https://wpseotest.com/contact-us/", "http://maps.google.com/maps?z=16&q=3999+mission+boulevard,+san+diego,+ca+92109", "https://wpseotest.com/2016/08/19/this-is-a-test-scheduled-post/", "https://wpseotest.com/2016/06/28/test-title/", "https://wpseotest.com/2015/10/18/globex-subsidiary-ice-cream-inc-creates-chicken-wing-flavor/", "https://wpseotest.wordpress.com", "https://wordpress.com/?ref=footer_blog"], "site_title": ["Globex Corporation \u2013 We make things better, or, sometimes, worse."]} 
] 
+0

Sie Pipelines verwenden können, um Ihren Wunsch Ausgang zu machen/erstellen –

Antwort

1

Haben Sie ein Element für jeden Link hier erhalten möchten?
Um das zu bekommen, was Sie tun möchten, finden Sie Artikelknoten, dann durchlaufen Sie sie und finden Sie die Felder, die Sie später zu einem Wörterbuch/scrapy.Item kombinieren.

def parse(self, response): 
    site_title = response.xpath("//title/text()").extract_first() 
    links = response.xpath("//a") 
    for link in links: 
     l = ItemLoader(selector=link) 
     l.add_value('site_title', site_title) 
     l.add_xpath('anchor_text', 'text()') 
     l.add_xpath('link', '@href') 
     yield l.load_item() 

Jetzt können Sie scrapy crawl myspider -o output.json laufen und Sie sollten wie immer etwas werden:

{[ 
    {"site_title": "title", 
    "anchor_text": "foo", 
    "link": "http://foo.com"}, 
    {"site_title": "title", 
    "anchor_text": "bar", 
    "link": "http://bar.com"} 
    ... 
    ] 
} 
+0

ich am Ende mit einer Pipeline; Ich könnte dein Beispiel nie zur Arbeit bringen. Ich bin mir nicht sicher, ob es etwas anderes gibt, das dazu führen könnte, dass es nicht richtig funktioniert. –

+0

Ich habe es in den Repo hier hochgeladen (die Version mit Pipelines) https://github.com/chrisfromthelc/scrapy-linkfinder Wenn Sie etwas blendend sehen, dass Probleme verursacht hat, war das nicht in Ihrem Code-Vorschlag. –

Verwandte Themen