2015-06-01 19 views
5

Mój plik items.py idzie tak:Jak używać funkcji re() do wyodrębniania danych ze zmiennej javascript za pomocą scrapy?

from scrapy.item import Item, Field 

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

i pająk jest:

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 

Cały kod JavaScript, patrzenia na stronie źródła, jest napisane wewnątrz: //html/body/table/tbody/tr[348]/td[2].

Dlaczego mój kod nie działa? Chcę wyodrębnić tylko cztery pola wymienione w pliku elementów.

+0

Proszę naprawić wgniecenie. – IanAuld

+0

Wykonano wcięcie. – Aditya

Odpowiedz

6

Zamiast wydobycia pole po polu za pomocą wyrażeń regularnych, wyciąg kompletny locations obiektu, załadować go poprzez json.loads() i wydobyć żądane dane ze słownika Pythona dostaniesz:

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

Ale dlaczego mój kod nie działa? – Aditya

+0

@Aditya przede wszystkim, nie musisz pętli po skryptach - jest tylko jeden "skrypt", który musisz zlokalizować. Poza tym, w zasadzie szukasz znacznika 'script' w każdym znalezionym znaczniku' script', który, logicznie, powoduje, że nic nie jest skrobane. – alecxe

+1

@Aditya w każdym razie, zapewniłem lepsze i bardziej niezawodne podejście. – alecxe