使用Nokogiri提取一些JSON


require 'open-uri'
require 'json'
require 'nokogiri'
doc = Nokogiri::HTML(open("http://www.highcharts.com/demo/"))
puts doc

但是我希望能够从这个网页中提取json,使用正则表达式似乎不起作用,如何通过XPath提取json ?

如何从URL访问脚本标记(不引用外部文件):

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

现在您只需要找到您想要的脚本块并提取您想要的数据(使用regex)。如果没有更多的细节,很难猜测你想要什么,依靠什么。

这是一个相当脆弱的正则表达式,可以找到我猜你正在寻找的东西:

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

这是你得到的:

{
  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]
  }]
}

注意这不是JSON;这是一个代表JavaScript代码的字符串,包含对象、字符串、数组、数字和函数字面值。

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

相关内容

  • 没有找到相关文章

最新更新