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

标签 javascript ruby regex open-uri ruby-2.1

我正在使用 OpenURI 检索网页:

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

现在我想解析属性 playerurl 的值, playerdatapageurl检索到的页面。它们出现在<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>

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

最佳答案

您可以使用 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 的 [] 方法。

关于javascript - 从检索到的页面的 JavaScript 中解析数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717894/

相关文章:

Javascript Regex 将括号和单引号替换为斜线

ruby-on-rails - 使用 :memory: database 运行 Rails 测试

ruby - 在 Ruby 中创建倒排索引哈希

javascript - 如何在 jquery/rails 中渲染新字段?

java - 行替换中的正则表达式

java - 如何使用模式类(正则表达式)计算 java 字符串中每个字符的出现次数

javascript - 使用 Javascript 读取 JSON 文件

javascript - 回调函数中未声明的变量

javascript - Ajax 调用(使用 jquery)在 5 分钟后不再有响应

javascript - 如何以毫秒为单位测量页面上的 mousemove?