2016-05-31 15 views
0

Ich versuche, JSON aus dem Skript Text, der speichert Daten analysiert.Es befindet sich innerhalb der Seite http://www.buildbase.co.uk/storefinder. Das Skript Text, den ich um arbeite ist http://pastebin.com/embed_js/3cnewiSh und mein Code ist wie folgt:JSON Parsing Fehler im Skript-Text Ruby

stores_url = "http://www.buildbase.co.uk/storefinder" 
mechanize = Mechanize.new 
stores_page = mechanize.get(stores_url) 
stores_script_txt = stores_page.search("//script[contains(text(), 'storeLocator.initialize(')]")[0].text 
stores_jsons = stores_script_txt.split("storeLocator.initialize($.parseJSON('{\\\"all\\\":")[-1].split(",\\\"selected\\\":0}') ,\tfalse);\n  });")[0] 
puts stores_jsons 
stores_result = JSON.parse(stores_jsons) 

Die JSON.parse gibt mir den Fehler:

from /home/private/.rvm/gems/ruby-2.1.5/gems/json-1.8.3/lib/json/common.rb:155:in `parse' 
from /home/private/.rvm/gems/ruby-2.1.5/gems/json-1.8.3/lib/json/common.rb:155:in `parse' 
from (irb):240 
from /home/private/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>' 

Ich weiß nicht, wohin ich gehe falsch, weil die JSON-Zeichenfolge für mich gültig scheint.

+0

können Sie ein einfaches 'legt stores_jsons' vor dem' stores_result = 'Zeile hinzufügen, damit wir die tatsächliche JSON sehen kann es versuchen zu parsen? –

+0

@PaulEllsworth jetzt getan. –

+0

@PaulEllsworth, Hallo Paul, ich habe einen weiteren Fehler korrigiert, als ich versucht habe, JSON in stores_jsons zu bekommen. Kannst du bitte sehen? –

Antwort

1

Es gab ein paar Probleme. Zuerst wurde der Text, den Sie erhielten, nicht richtig formatiert, da er "anstelle von Anführungszeichen usw." verwendete.

Zweitens hatte es HTML-Tags, die Zitate enthielten, die das Zitat im eigentlichen JSON unterbrachen. ich schnappte mir ein snippet, das nur die Tags abstreift.

ich weiß nicht, wie viel von den Daten, die Sie benötigen, aber dieser Code funktioniert. ich bin auch nicht sicher, wie robust es ist (zB I ersetzt nur " für jede \")

require 'mechanize' 
stores_url = "http://www.buildbase.co.uk/storefinder" 
mechanize = Mechanize.new 
stores_page = mechanize.get(stores_url) 
stores_script_txt = stores_page.search("//script[contains(text(), 'storeLocator.initialize(')]")[0].text 
stores_jsons = stores_script_txt.split("storeLocator.initialize($.parseJSON('{\\\"all\\\":")[-1].split(",\\\"selected\\\":0}') ,\tfalse);\n  });")[0] 
stores_jsons = stores_jsons.gsub('\"', '"').gsub(/<\/?[^>]*>/, '').gsub(/\n\n+/, "\n").gsub(/^\n|\n$/, '') 
stores_result = JSON.parse(stores_jsons)