从检索到的页面的JavaScript中解析数据

时间:2014-11-03 15:54:16

标签: javascript ruby regex open-uri ruby-2.1

我正在使用OpenURI检索网页:

require 'open-uri'
page = open('http://www.example.com').read.scrub

现在,我想解析检索到的网页的属性playerurlplayerdatapageurl的值。它们显示在<script>标记中:

<script>
..
..
  PlayerWatchdog.init({
      'playerurl': 'http://cdn.static.de/now/player.swf?ts=2011354353',
      'playerdata': 'http://www.example.com/player',
      'pageurl': 'http://www.example.com?test=2',
      });
..
..
</script>

实现这一目标的最明智的方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用HTML解析器(例如Nokogiri)拆分HTML文档,然后快速找到您之后的<script>标记。 <script>标记内的内容是文本,因此Nokogiri的text方法将返回该内容。然后,有选择地检索所需的行,这可以通过简单的正则表达式来完成:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<html>
  <head>
    <script>
      PlayerWatchdog.init({
          'playerurl': 'http://cdn.static.de/now/player.swf?ts=2011354353',
          'playerdata': 'http://www.example.com/player',
          'pageurl': 'http://www.example.com?test=2',
          });
    </script>
  </head>
</html>
EOT

script_text = doc.at('script').text 
playerurl, playerdata, pageurl = %w[
  playerurl
  playerdata
  pageurl
].map{ |i| script_text[/'#{ i }': '([^']+')/, 1] }

playerurl # => "http://cdn.static.de/now/player.swf?ts=2011354353'"
playerdata # => "http://www.example.com/player'"
pageurl # => "http://www.example.com?test=2'"

at会返回第一个匹配的<script> Node个实例。根据HTML,您可能不希望第一个匹配<script>。您可以改为使用search,它将返回NodeSet,类似于节点数组,然后从NodeSet中获取特定元素,或者,您可以使用XPath而不是使用CSS选择器这将让您轻松指定所需标签的特定位置。

找到标签后,text返回其内容,任务从Nokogiri移动到使用模式查找所需内容。 /'#{ i }': '([^']+')/是一个简单的模式,用于查找单词,在i后传入: ',然后将所有内容捕获到下一个'。该模式将传递给String的[]方法。

答案 1 :(得分:1)

Ruby没有内置的javascript解析功能。你可以使用正则表达式,虽然这对页面的格式很敏感(例如,如果页面开始使用字符串的双引号,这将会中断):

playerurl = page[/'playerurl':\s*'([^']*)'/, 1]