2011-11-28 3 views
2
require 'open-uri' 
require 'json' 
require 'nokogiri' 

doc = Nokogiri::HTML(open("http://www.highcharts.com/demo/")) 

puts doc 

그러나 정규식을 사용하여이 웹 페이지에서 json을 추출 할 수 있기를 원하며, XPath를 통해 JSON을 추출하는 방법은 무엇입니까?Nokogiri를 사용하여 일부 JSON을 추출합니다.

require 'open-uri' 
require 'nokogiri' 
doc = Nokogiri.HTML(open('http://www.highcharts.com/demo/')) 
inline_script = doc.xpath('//script[not(@src)]') 
inline_script.each do |script| 
    puts "-"*50, script.text 
end 

지금 당신은 당신이 원하는 스크립트 블록을 찾아 바로 추출해야합니다 : 여기

+0

제공하신 URL에는 * JSON 데이터가 없습니다. ('new Highcharts.Chart (...)'에 대한 인수와 같이 일부 JavaScript 객체 리터럴이 있지만 실제로는 JSON이 아닙니다.) 추출하려는 원시 자바 스크립트 데이터 또는 추출하려고하는 원시 자바 스크립트 데이터입니까? 어딘가에서 다른 데이터를 얻을 수 있습니까? ** 당신이 정말로 성취하고자하는 것은 무엇입니까? ** – Phrogz

답변

4

당신이 URL에서 (외부 파일을 참조하지 않는) 스크립트 태그를 액세스 할 수있는 방법 원하는 데이터 (regex 사용). 더 자세한 내용이 없으면, 당신이 원하고 뭘 믿고 있는지 짐작하기가 어렵습니다. 당신이 밖으로 무엇을 얻을 여기

inline = doc.xpath('//script[not(@src)]').map(&:text) 
data = inline.map{ |js| js[/new Highcharts\.Chart\((.+?\})\);/m,1] }.compact[0] 
puts data 

:

여기에 내가 당신을 추측하고있어 찾고 있었다 발견이 매우 깨지기 쉬운 정규식의이 JSON하지

{ 
    chart: { 
    renderTo: 'container', 
    defaultSeriesType: 'line', 
    marginRight: 130, 
    marginBottom: 25 
    }, 
    title: { 
    text: 'Monthly Average Temperature', 
    x: -20 //center 
    }, 
    subtitle: { 
    text: 'Source: WorldClimate.com', 
    x: -20 
    }, 
    xAxis: { 
    categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
     'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 
    }, 
    yAxis: { 
    title: { 
     text: 'Temperature (°C)' 
    }, 
    plotLines: [{ 
     value: 0, 
     width: 1, 
     color: '#808080' 
    }] 
    }, 
    tooltip: { 
    formatter: function() { 
       return '<b>'+ this.series.name +'</b><br/>'+ 
     this.x +': '+ this.y +'°C'; 
    } 
    }, 
    legend: { 
    layout: 'vertical', 
    align: 'right', 
    verticalAlign: 'top', 
    x: -10, 
    y: 100, 
    borderWidth: 0 
    }, 
    series: [{ 
    name: 'Tokyo', 
    data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6] 
    }, { 
    name: 'New York', 
    data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5] 
    }, { 
    name: 'Berlin', 
    data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0] 
    }, { 
    name: 'London', 
    data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8] 
    }] 
} 

것을; 이것은 object, string, array, numeric 및 함수 리터럴을 사용하여 JavaScript 코드를 나타내는 문자열입니다.

+0

멋진 답변을 주셔서 감사합니다. 실제로 JavaScript 코드의 시리즈 부분을 추출하려고했습니다. Json이 아니라고 지적 해 주셔서 감사합니다. – Sun

3
require 'open-uri' 
require 'json' 
doc = JSON.parse(open("http://www.highcharts.com/demo/")) 
+0

페이지에는 혼합 된 내용 - HTML과 javascript가 있기 때문에 작동하지 않습니다. – taro

+2

이 경우 질문은 잘못된 것이지 대답은 아닙니다. – pguardiario

+6

btw를 사용하려면 'open-uri'가 필요하고 .SpringIO 객체이기 때문에 열린 결과를 읽어야합니다. doc = JSON.parse (open ('xxxxx'). read)) – Sikora

관련 문제