2016-06-28 19 views
1

Ich möchte Daten auf dieser Website extrahieren: http://www.pokepedia.fr/Pikachu Ich lerne die Python und wie Scrapy zu verwenden und mein Problem ist: Warum kann ich die Daten nicht mit Xpath abrufen?Scrapy Xpath Ausgang leer

Mein Xpath sieht gut aus, wenn ich xpath in meinem Browser teste, es gibt mir den richtigen Wert zurück. (Google Chrome)

import re 
from scrapy import Spider 
from scrapy.selector import Selector 

from stack.items import StackItem 


class StackSpider(Spider): 
name = "stack" 
allowed_domains = ["pokepedia.fr"] 
start_urls = [ 
    "http://www.pokepedia.fr/Pikachu", 
] 

def unicodize(seg): 
    if re.match(r'\\u[0-9a-f]{4}', seg): 
     return seg.decode('unicode-escape') 

    return seg.decode('utf-8') 

def parse(self, response): 
    pokemon = Selector(response).xpath('//*[@id="mw-content-text"]/table[2]') 

    for question in pokemon: 
     item = StackItem() 
     item['title'] = question.xpath(
      '//*[@id="mw-content-text"]/table[2]/tbody/tr[1]/th[2]/text()').extract()[0] 
     yield item 

ich den Namen des pokemon in der Seite extrahieren will, aber wenn ich benutze:

scrapy crawl stack -o items.json -t json 

Mein Json Ausgang:

[ 

In meiner Konsole i habe diesen Fehler:

IndexError : list index out of range 

ich habe folgen ed dieses tuto: https://realpython.com/blog/python/web-scraping-with-scrapy-and-mongodb/

+0

wie in einer bereitgestellten Antwort beschrieben, seien Sie vorsichtig, wenn Sie mit einem beliebigen Webbrowser der dev console/xpath viewer vertraut sind, da das angezeigte Dokument nicht immer genau dem HTML entspricht, das die Seite erzeugt. Oft werden Tags hinzugefügt und defekter HTML-Code repariert. es ist oft besser, das html der Seite direkt herunterzuladen (das einfache Python-Skript kann das tun) und das Wort davon. Web Scraping ist ein großartiges Tool, um zu lernen, aber behalte diesen Tipp immer im Hinterkopf, er hat mich ein paar Mal gebissen. – Kaden

Antwort

1

Versuchen Sie, diese

question.xpath('//*[@id="mw-content-text"]/table[2]/tr[1]/th[2]/text()').extract()[0] 

der Browser die tbody Tags hinzufügt. Sie sind nicht im ursprünglichen HTML, deshalb gibt scrapy eine leere Datei zurück.

PS: Sie könnten in Betracht ziehen

und anschließend

response.xpath('...YOUR SELECTOR..') 

für das Debuggen und Testen verwenden.

+0

Funktioniert gut in meinem Browser, aber mit scrapy ist meine Ausgabe leer. Es ist ein Fehler in Ihrer Antwort ist/text() und nicht .text() – Quentin

+0

@Quentin Ich habe meine Antwort bearbeitet, überprüfen Sie noch einmal, es sollte funktionieren. –

+0

Die Shell gibt ein leeres Array mit Ihrem Xpath-Ausdruck zurück, aber danke, dass ich Scrapy Shell für Test und Debugging entdeckt habe. – Quentin

Verwandte Themen