我正在使用OpenURI检索网页:
require 'open-uri'
page = open('http://www.example.com').read.scrub
现在,我想解析检索到的网页的属性playerurl
,playerdata
和pageurl
的值。它们显示在<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>
实现这一目标的最明智的方法是什么?
答案 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]