2015-06-01 12 views
5

Il mio file items.py va in questo modo:Come usare re() per estrarre i dati dalla variabile javascript usando scrapy?

from scrapy.item import Item, Field 

class SpiItem(Item): 
    title = Field() 
    lat = Field() 
    lng = Field() 
    add = Field() 

e il ragno è:

import scrapy 
import re 

from spi.items import SpiItem 

class HdfcSpider(scrapy.Spider): 
    name = "hdfc" 
    allowed_domains = ["hdfc.com"] 
    start_urls = ["http://hdfc.com/branch-locator"] 

    def parse(self,response): 
     addresses = response.xpath('//script') 
     for sel in addresses: 
      item = SpiItem() 
      item['title'] = sel.xpath('//script[@type="text/javascript"][1]').re('(?<="title":).+(?=")') 
      item['lat'] = sel.xpath('//script[@type="text/javascript"][1]').re('(?<="latitude":).+(?=")') 
      item['lng'] = sel.xpath('//script[@type="text/javascript"][1]').re('(?<="longitude":).+(?=")') 
      item['add'] = sel.xpath('//script[@type="text/javascript"][1]').re('(?<="html":).+(?=")') 
      yield item 

Il codice javascript intera, sulla sorgente della pagina di visualizzazione, è scritto dentro: //html/body/table/tbody/tr[348]/td[2].

Perché il mio codice non funziona? Voglio estrarre solo i quattro campi menzionati nel file degli articoli.

+0

Si prega di risolvere il tuo rientro. – IanAuld

+0

Rientro completato. – Aditya

risposta

6

Invece di estrazione campo per campo usando le espressioni regolari, estrarre il completo locations oggetto, caricarla tramite json.loads() ed estrarre i dati desiderati dal dizionario Python si otterrà:

def parse(self,response): 
    pattern = re.compile(r"var locations= ({.*?});", re.MULTILINE | re.DOTALL) 
    locations = response.xpath('//script[contains(., "var locations")]/text()').re(pattern)[0] 
    locations = json.loads(locations) 
    for title, data in locations.iteritems(): 
     print title 
+0

Ma perché il mio codice non funziona? – Aditya

+0

@Aditya prima di tutto, non è necessario eseguire il loop degli script in primo luogo - c'è solo un 'script' che è necessario individuare. In più, stai fondamentalmente cercando il tag 'script' dentro ogni tag' script' che hai trovato, il che, logicamente, non porta a nulla di scraping. – alecxe

+1

@Aditya comunque, ho fornito un approccio migliore e più affidabile. – alecxe

Problemi correlati