2017-12-17 3 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

を見ます'Request '(...、meta = {" Country ":name_of_country})で' meta = 'を使用して次のリクエストに' 'Country'リクエストは、それを使用して、単一の地域を持つ多くのアイテムではなく、国と地域内の1つのアイテムを作成できます。 – furas

+0

このページにURLを追加してテストすることができますか? – furas

答えて

1

私は決してXMLを使用しませんでしたが、Countryを(meta=を使用して)2番目の要求に送信してから、parse_regionにすべてのデータを含む1つの要素を作成することができます。

私はhttp://quotes.toscrape.comを使っていくつかのタグを取得し、Countryとして使用し、次にparse_regionに送って、すべての地域を取得して1つの要素のみを取得します。

それは

<?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>を削除する可能性が与えられるので、解決策は完璧ではない - あなたが送ることができる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() 
関連する問題