2017-12-17 11 views
1

Ich kratze eine Site und ich möchte ein XML erzeugen, wo jede Region innerhalb des Landes ist, zu dem es gehört.Wie man XML in einer scrapy Spinne richtig einrückt

def parse(self, response): 

     #here i parse the country names 

     country_names = response.xpath('//some countries/text()').extract() 
     for name_of_country in countries : 
      yield {"Country": name_of_country } 
      yield Request(country_url, callback=self.parse_regions) 

    def parse_regions(self, response): 

     #here i parse the regions of each country 

     regions= response.xpath('//some regions/text()').extract() 
     for region in regions 
      yield {"Region": region } 

Nun ist die XML erscheint wie:

<Country1></Country1> 
 
<Country2></Country2> 
 
<Region>Region1</Region> 
 
<Region>Region2</Region> 
 
<Region>Region3</Region> 
 
<Region>Region1</Region> 
 
<Region>Region2</Region> 
 
<Region>Region3</Region>

ich die XML als angezeigt werden soll folgt:

<Country1> 
 
    <Region>Region1</Region> 
 
    <Region>Region2</Region> 
 
    <Region>Region3</Region> 
 
</Country1> 
 
<Country2> 
 
    <Region>Region1</Region> 
 
    <Region>Region2</Region> 
 
    <Region>Region3</Region> 
 
</Country2>

+0

Sie senden können 'Country' zu nächsten Anfragen mit' meta = 'in' Requests (..., meta = {"Land": name_of_country}) 'und zweitens Mit der Anfrage können Sie einen Artikel mit Land und allen Regionen erstellen, nicht viele Artikel mit einzelnen Regionen. – furas

+0

können Sie URL zu dieser Seite hinzufügen, damit wir es testen können. – furas

Antwort

1

Ich habe nie XML verwendet, aber Sie können Country an zweite Anfrage senden (mit meta=) und dann in parse_region ein Element mit allen Daten erstellen.

Ich verwende http://quotes.toscrape.com, um einige Tags zu erhalten und als Country zu verwenden, und dann sende ich an parse_region, die alle Regionen erhalten und nur ein Element ergeben.

Lösung ist nicht perfekt, weil es

<?xml version="1.0" encoding="utf-8"?> 
<items> 
<item> 
    <Country books> 
     <value>“The person, ...”</value> 
     <value>“Good friends, ...”</value> 
    </Country books> 
</item> 
<item> 
    <Country humor> 
     <value>“The person, ...”</value> 
     <value>“A day without ...”</value> 
    </Country humor> 
</item> 
</items> 

Vielleicht mit eigenem Exporteur gibt Sie <value> in <region> und entfernen <item> ändern könnten - siehe Formatting Scrapy's output to XML

Vollarbeitsbeispiel

#!/usr/bin/env python3 

import scrapy 

class MySpider(scrapy.Spider): 

    name = 'myspider' 

    start_urls = ['http://quotes.toscrape.com/'] 

    def parse(self, response): 
     print('url:', response.url) 

     for quote in response.css('.tag-item a'): 
      country = 'Country ' + quote.css('::text').extract_first() 

      url = quote.css('::attr(href)').extract_first() 
      url = response.urljoin(url) 

      #print('country/url:', country, url) 

      # send `country` to `parse_region` 
      yield scrapy.Request(url, meta={'country': country}, callback=self.parse_region) 

    def parse_region(self, response): 
     print('url:', response.url) 

     country = response.meta['country'] 

     all_regions = response.css('.quote .text ::text').extract() 

     #for region in all_regions: 
     # print('--- region ---') 
     # print(region) 

     # create one `<countr>` with all <regions>` 
     yield {country: all_regions} 


# --- it runs without project and saves in `output.csv` --- 

from scrapy.crawler import CrawlerProcess 

c = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/5.0', 

    # save in XML, CSV or JSON 
    'FEED_FORMAT': 'xml',  # 'json, csv 
    'FEED_URI': 'output.xml', # 'output.json, output.csv 
}) 
c.crawl(MySpider) 
c.start() 
Verwandte Themen