2016-04-26 12 views
0

が拡大する前に、いくつかの箇条書きの私のクエリを要約すると:Scrapy:自動入力抽出されたフィールド

  • ターゲットのウェブサイトは、私はこすりしたい100+のフィールドを持つスポーツのウェブサイトです。
  • 空のクラスを宣言してフィールド名を入力し、関連する値を入力したいとします。
  • スクラップしたアイテムを明示的に宣言していないシナリオのアイテムファイルを変更する方法が不明です。

真ちゅうのタックに降りてください。

a rugby databaseから掻き集めようとしています。コードのスニペットは以下の通りです:

<TeamData Possession="0.50" Score="40" Side="Home" TeamRef="t1550" Territory="0"> 
    <Stat Type="restart_opp_player">0</Stat> 
    <Stat Type="kick_oppn_collection">0</Stat> 
    <Stat Type="kicks_from_hand">0</Stat> 
    <Stat Type="penalty_conceded_killing_ruck">0</Stat> 
    ... 

このコードは、明示的に各属性を定義するための痛みだろう何かを作るために周りに別の140行のために続けています。

各属性を1つずつ抽出するのではなく、空のクラスを定義し、それをさまざまな属性で埋めることができます。これは、シェル内で実現するのはかなり簡単です。以上を踏まえ

class RugbyItem(params): 
def __init__(self, params) 
    selc.__dict__.update(params) 

home_attribute_names = response.xpath('//TeamData[@Side="Home"]/Stat/@Type').extract() 
home_attribute_stats = response.xpath('//TeamData[@Side="Home"]/Stat/text()').extract() 
concat = {k: v for (k, v) in (zip(home_names, home_stats))} 

home_data = RugbyItem(concat) 

、誰かが私はアイテム

class RugbyItem(scrapy.Item): 
??? = scrapy.Field() 

とスパイダークラスファイル構造化すべきかの方法を考え出すに私を助けることができます。

class MySpider(BaseSpider): 
name  = "rugbyspider" 
allowed_domains = ["opta.net"] 
start_urls = ["http://omo.akamai.opta.net/?feed_type=ruf9&game_id=113013&user=OWV3&psw=trDd59TW"] 

def parse(self, response): 
    home_attribute_names = response.xpath('//TeamData[@Side="Home"]/Stat/@Type').extract() 
    home_attribute_stats = response.xpath('//TeamData[@Side="Home"]/Stat/text()').extract() 
    concat = {k: v for (k, v) in (zip(home_names, home_stats))} 
    home_data = RugbyItem(concat) 
    yield home_data 

ありがとうございます!

答えて

0

scrapy.Itemインスタンスを生成する義務がない場合は、dictを返すこともできますが、これは必要な制限に縛られません。

+0

私はあなたが私のupvoteに値すると認めなければなりません。 –

関連する問題