2016-04-26 3 views
0

Zu meiner Abfrage in ein paar Aufzählungszeichen vor dem Expandieren zusammenzufassen:Scrapy: automatisch ausgefüllt extrahiert Felder

  • Ziel-Website ist eine Sport-Website mit mehr als 100 Felder, die ich kratzen wollen.
  • Ich möchte eine leere Klasse deklarieren, um mit den Feldnamen zu füllen und sie mit den relevanten Werten zu füllen.
  • Ich bin unklar, wie Sie die Items-Datei für ein Szenario ändern, in dem Sie nicht explizit Ihre Scraped-Elemente deklarieren.

Jetzt, um zu Messing-Reißzwecken zu kommen.

Ich suche nach kratzen von a rugby database. Ein Ausschnitt des Codes ist unter:

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

Dieser Code setzt auf rund weitere 140 Zeilen etwas zu machen, die ein Schmerz sein würde jedes Attribut explizit zu definieren.

Anstatt jedes Attribut einzeln zu extrahieren, möchte ich in der Lage sein, eine leere Klasse zu definieren und sie dann mit den verschiedenen Attributen zu füllen. Dies ist relativ einfach innerhalb der Shell zu erreichen.

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) 

auf dem oben Basierend, jemand in herauszufinden, helfen Sie mir konnte, was, wie ich die Artikel

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

und die Spinne Klasse Dateistruktur sollte.

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 

Danke für die Hilfe!

Antwort

0

Sie sind nicht verpflichtet, eine scrapy.Item Instanz zu liefern, können Sie auch eine dict ergeben, die nicht an die Einschränkungen gebunden ist, die Sie wollen.

+0

Ich muss zugeben, dass Sie meinen upvote verdienen. –