2016-07-31 12 views
1

ich die wenigen Artikel der Objekte, die die Eigenschaften des ObjektsScrapy. Die Schaffung von komplexen Strukturen in Folge Parsen (dict in dict)

import scrapy 
 

 

 
class FullName(scrapy.Item): 
 
    first = scrapy.Field() 
 
    second = scrapy.Field() 
 
    middle = scrapy.Field() 
 

 
class Physical(scrapy.Item): 
 
    growth = scrapy.Field() 
 
    weight = scrapy.Field() 
 
    hair = scrapy.Field()

Und ich habe den Artikel beschreiben, das gehört zu das Thema. Als Felder möchte ich die Artikeleigenschaften des Objekts

class Human(scrapy.Item): 
 
    sex = scrapy.Field() 
 
    age = scrapy.Field() 
 
    physical = <...Physical Item> 
 
    full_name = <...FullName Item>

so einzufügen, wenn Sie nisten Daten auf eine Struktur mit dem angegebenen

{ 
age: 23, 
sex: male, 
full_name: {first: test, second: test, middle: test} 
physical: {growth: 90, height: 190, hair: blonde}, 
... 
} 

Verschachtelung exportieren in beliebiger Tiefe sein kann .

Katze ich mache es mit Scrapy? Welche Struktur für Spinnen? in scrapy docs über extending item und loaders kann ich nicht finden.

oder ich wählte das falsche Werkzeug, und ich muss manuell tun?


UPD. Über Spinnen.

Welche Struktur für Spinne? Wie Sie wissen, müssen wir das Feld 'physisch' mit dem Spider PhysicalSpider verbinden, die die aktuelle URL übergeben. Wie geht es? Fix mich, bitte.

class PhysicalSpider(scrapy.Spider): 
    name = "physical" 

    def parse(self, response): 
     item = PhysicalItem() 
     item['weight'] = response.xpath('path').extract() 
     yield item 

class HumanSpider(scrapy.Spider): 
    name = "human" 
    start_urls = [ 
     "url1", 
     "url2", 
    ] 

    def parse(self, response): 
     item = HumanItem() 
     item['sex'] = response.xpath('path').extract() 
     item['age'] = response.xpath('path')[1].extract() 
     item['physical'] = PhysicalSpider(???) 
     yield item 

Antwort

1
class Human(scrapy.Item): 
    sex = scrapy.Field() 
    physical = scrapy.Field() 
    full_name = scrapy.Field() 

class Physical(scrapy.Item): 
    height = scrapy.Field() 

p = Physical() 
p['height'] = 180 
h = Human() 
h['physical'] = p 
h['sex'] = 'yes' 
return h 

Ergebnis:

{'physical': {'height': 180}, 'sex': 'yes'} 

Nach Ihrer Spinne Beispiel:

class HumanSpider(scrapy.Spider): 
    name = "human" 
    start_urls = [ 
     "url1", 
    ] 

    def parse(self, response): 
     item = HumanItem() 
     item['sex'] = response.xpath('path').extract() 
     item['age'] = response.xpath('path')[1].extract() 
     physical_item = Physicalitem() 
     physical_item['height'] = response.xpath('path').extract() 
     item['physical'] = physical_item 
     yield item 
+0

Nice! aber was wird die Struktur für Spinne sein? Aktualisierte Frage – while1pass

+1

@ while1pass Warum hast du zwei Spinnen? Werden physische Daten auf einer anderen Website gespeichert? Können Sie Ihre Logik mit einem realen Beispiel verdeutlichen, weil dies nur verwirrend ist? – Granitosaurus

+0

ist es nur meine Meinung mit 2 Spinnen. In Frage habe ich echte Daten (ein bisschen einfacher als real). Du hast mir über Items Struktur geantwortet, aber was ist die Struktur einer Spinne, die ich dafür erstellen sollte? – while1pass