2016-03-20 3 views
3

ich mehrere hrefs zu bekommen versuche, die wie diese in HTML-Blöcke (sorry für die Formatierung aber ich denke, alles was Sie brauchen):Warum kann Scrapy hier nicht finden?

<li class="evt-click" data-tab="yo" data-public="yoyo" data-tracking="1" data-tracking-tag="yo_name" data-tracking-params="{'type': 'yo'}" href="/the/url/i/want"> 
    <a href="javascript:void(0)">Yo</a> 
</li> 

Mein scrapy Crawling die li Elemente wie elmts Ich möchte zu bekommen ist in der Lage aber dann, wenn ich elmts.xpath('@href') versuche, wird keine Verbindung zurückgegeben.

Ich verstehe es nicht, aber ich bin 2 Wochen alt mit Scrapy!

Antwort

3

Wenn Sie die hrefs vom li mit der Klasse evt Sie auf möchten, können Sie die folgende XPath verwenden:

xpath('//li[@class="evt-click"]/@href')) 

In Ihrem eigenen Beispiel benötigen Sie:

xpath("./@href") 

Der Grund, warum keiner arbeitet, ist, weil das, was Sie suchen, nicht in der HTML in der Verbindung existiert, die Sie zur Verfügung gestellt haben, dort sind 11 li class="evt-click" und keine enthalten irgendwelche href bar die js in der einen tag:

enter image description here

Sie scrapy-splash Seite erlauben können vollständig zu machen, die dynamisch generierten Daten zu erhalten, können Sie es per Link zu installieren Anleitung:

In setting.py:

DOWNLOADER_MIDDLEWARES = { 
    'scrapyjs.SplashMiddleware': 725, 
} 

Start docker Beispiel:

docker run -p 8050:8050 scrapinghub/splash: 

Dann ist dies genug, um die gewünschten Daten zu erhalten:

import scrapy 

class MySpider(scrapy.Spider): 
    name = "deez" 
    start_urls = ["http://www.deezer.com/profile/154723101"] 

    def start_requests(self): 
     for url in self.start_urls: 
      yield scrapy.Request(url, self.parse, meta={ 
       'splash': { 
        'endpoint': 'render.html', 
        'args': {'wait': 1} 
       } 
      }) 

    def parse(self, response): 
     print(response.xpath("//li[@class='evt-click']").extract()) 

Ausgang:

$ scrapy crawl deez 
............................. 
2016-03-20 23:01:12 [scrapy] DEBUG: Crawled (200) <POST http://127.0.0.1:8050/render.html> (referer: None) 
[u'/profile/154723101/loved', u'/profile/154723101/playlists', u'/profile/154723101/albums', u'/profile/154723101/artists', u'/profile/154723101/radios', u'/profile/154723101/following', u'/profile/154723101/followers'] 

selenium ist auch eine weitere Option.

+0

Ich versuchte es auch, aber es gab nichts zurück. Ich habe auch versucht, xpath ('// @ href'), aber ich habe nur die javascript: void (0) Texte ohne etwas anderes. – baptiste

+0

Können Sie den Link teilen? –

+0

Dies ist der Link: http://www.deezer.com/profile/154723101 – baptiste