2017-12-17 37 views
1

사이트를 고치고 있으며 각 지역이 속한 국가 내에있는 xml을 생성하려고합니다. 내가으로 표시 할 수있는 XML은 다음 원하는거미집에서 XML을 올바르게 들여 쓰는 법

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

: 같은

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 } 

이제 XML이 나타납니다

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

+0

보낼 수 있습니다 참조 -이

<?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> 

어쩌면 자신의 수출과 당신이 <region><value>을 변경하고 <item>을 제거 할 수 있습니다 제공하기 때문에

솔루션은 완벽하지 않습니다 '요청 '(..., meta = { "국가": name_of_country})에서'meta ='를 사용하여 다음 요청에'국가 ' 요청을 사용하여 국가 및 모든 지역이 포함 된 항목 하나를 만들 수 있습니다. 단 하나의 지역이있는 항목은 많지 않습니다. – furas

+0

우리가 테스트 할 수 있도록이 페이지에 url을 추가 할 수 있습니까? – furas

답변

1

나는 결코 XML을 사용하지 않았지만 Country을 두 번째 요청 (meta= 사용)으로 보낸 다음 parse_region에서 모든 데이터가있는 하나의 요소를 만들 수 있습니다.

일부 태그를 얻고 Country으로 사용하려면 parse_region으로 보내고 하나의 요소 만 생성합니다. Formatting Scrapy's output to XML

전체 작업의 예

#!/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()