2015-06-01 12 views
5

Benim items.py dosya böyle giderScrub kullanarak javascript değişkeninden veri ayıklamak için re() nasıl kullanılır?</p> <pre><code>from scrapy.item import Item, Field class SpiItem(Item): title = Field() lat = Field() lng = Field() add = Field() </code></pre> <p>ve örümcek:

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 

bütün javascript kodu, görüntüleme sayfası kaynağına, içeride yazılır: //html/body/table/tbody/tr[348]/td[2].

Neden kodum çalışmıyor? Öğeler dosyasında belirtilen sadece dört alanı çıkarmak istiyorum. Bunun yerine normal ifadeler kullanarak alana göre alan çıkarma

+0

girintinizi düzeltin. – IanAuld

+0

Girinti tamamlandı. – Aditya

cevap

6

elde edersiniz, tam locations nesneyi ayıklamak json.loads() yoluyla yüklemek ve Python sözlükten istenen veri ayıklamak:

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

Ancak, neden kodum çalışmıyor? – Aditya

+0

@Aditya her şeyden önce, ilk etapta komut dosyalarının üstesinden gelmenize gerek yok - sadece bir tane bulunsun '' script '' bulunmalı. Artı, temelde, sen, mantıksal olarak, hiçbir şeyin kazınamaya uğramayacağını bulduğun bulduğun her 'script' etiketinin içinde 'script' etiketini arıyorsun. – alecxe

+1

@Aditya yine de, daha iyi ve daha güvenilir bir yaklaşım sağladım. – alecxe

İlgili konular