2015-06-01 5 views
5

Meine items.py Datei geht so:Wie verwendet man re() um Daten aus JavaScript Variablen mit scrapy zu extrahieren?

from scrapy.item import Item, Field 

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

und die Spinne ist:

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 

Der gesamte Javascript-Code, auf Sicht Seite Quelle, nach innen geschrieben wird: //html/body/table/tbody/tr[348]/td[2].

Warum funktioniert mein Code nicht? Ich möchte nur die vier Felder in der Artikeldatei extrahieren.

+0

Sie bitte Ihre Einzug fixieren. – IanAuld

+0

Einrückung erfolgt. – Aditya

Antwort

6

Stattdessen Gebiet der Extraktion von Feld mit regulären Ausdrücken, extrahieren Sie die komplette locations Objekt, laden Sie es über json.loads() und extrahieren Sie die gewünschten Daten aus dem Python-Wörterbuch erhalten Sie:

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

Aber warum funktioniert mein Code nicht? – Aditya

+0

@Aditya zuallererst müssen Sie die Skripts nicht in erster Linie durchlaufen - es gibt nur ein "Skript", das Sie suchen müssen. Außerdem suchst du grundsätzlich nach "script" -Tag in jedem gefundenen "script" -Tag, was logischerweise dazu führt, dass nichts geschabt wird. – alecxe

+1

@Aditya sowieso, ich habe einen besseren und zuverlässigeren Ansatz zur Verfügung gestellt. – alecxe