2016-06-01 4 views
0

Ich habe diese TabelleExtrahieren von Daten aus der Tabelle mit Scrapy

<table class="specs-table"> 
    <tbody> 
    <tr> 
     <td colspan="2" class="group">Sumary</td> 
    </tr> 
    <tr> 
     <td class="specs-left">Name</td> 
     <td class="specs-right">ROG GL552JX </td> 
    </tr> 
    <tr class="noborder-bottom"> 
     <td class="specs-left">Category</td> 
     <td class="specs-right">Gaming </td> 
    </tr> 
    <tr> 
     <td colspan="2" class="group">Technical Details</td> 
    </tr> 
    <tr> 
     <td class="specs-left">Name</td> 
     <td class="specs-right">Asus 555 </td> 
     </tr> 
    <tr> 
     <td class="specs-left">Resolution </td> 
     <td class="specs-right">1920 x 1080 pixels </td> 
    </tr> 
    <tr class="noborder-bottom"> 
     <td class="specs-left"> Processor </td> 
     <td class="specs-right"> 2.1 GHz </td> 
    </tr> 
    </tbody> 
</table> 

Aus dieser Tabelle ich meine Scrapy das erste Vorkommen des Textes „Name“ finden möchten und den Wert aus der nächsten Zelle zu kopieren (in diesem Fall "ROG GL552JX") und finde das nächste Vorkommen des Textes "Name" und kopiere den Wert "Asus 555".

Das Ergebnis ich brauche:

'Name': [u'Asus 555'], 
'Name': [u'Asus 555'], 

Das Problem ist, dass in dieser Tabelle Ich habe zwei Vorkommen des Textes „Name“ und Scrapy kopiert den Wert beider Vorkommen.

Mein Ergebnis ist:

'Name': [u'ROG GL552JX', u'Asus 555'], 

Mein bietet:

def parse(self, response): 
    next_selector = response.xpath('//*[@aria-label="Pagina urmatoare"]//@href') 
    for url in next_selector.extract(): 
     yield Request(urlparse.urljoin(response.url, url)) 

    item_selector = response.xpath('//*[contains(@class, "pb-name")]//@href') 
    for url in item_selector.extract(): 
     yield Request(urlparse.urljoin(response.url, url), callback=self.parse_item) 


def parse_item(self, response): 
    l = ItemLoader(item = PcgItem(), response=response,) 

    l.add_xpath('Name', 'Name', '//tr/td[contains(text(), "Name")]/following-sibling::td/text()',', MapCompose(unicode.strip, unicode.title)) 
    return l.load_item() 

Wie kann ich dieses Problem lösen? Danke

+0

Bitte korrigieren Sie den Code, schlägt es auf Einrückung fehl und Ihre 'add_xpath' sollte nicht funktionieren – eLRuLL

Antwort

0

wenn Sie ein Element pro Name benötigen, dann sollten Sie so etwas wie:

for sel in response.xpath('//tr/td[contains(text(), "Name")]/following-sibling::td/text()'): 
    l = ItemLoader(...) 
    l.add_value('Name', sel.extract_first()) 
    ... 
    yield l.load_item() 

Nun, wenn Sie das alles innerhalb eines Artikels wollen, würde ich empfehlen, es zu verlassen, wie es ist (a Liste), weil ein scrapy.Item ein Wörterbuch ist, so dass Sie nicht 2 Name als Schlüssel haben können.

Verwandte Themen