Ruby解析CSS文件的HTML

时间:2010-07-12 10:25:40

标签: ruby regex nokogiri html-parsing

我正在为我的网站使用一些HTML,基本上将我的网站从PHP移动到Rails。

我有数千页,网站的某些部分有不同的CSS文件。

我可以很好地抓取<link>标签,但是如果它是IE6 / IE7 / IE8等,我为不同的样式表添加了一些条件。

我想弄清楚如何解析这个:

<!--[if lt IE 7]>
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie6.css" />
<![endif]-->
<!--[if IE 7]>
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie7.css" />
<![endif]-->      
<!--[if IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie8.css" />
<![endif]-->

最后:

/templates/default/css/ie6.css<br />
/templates/default/css/ie7.css<br />
/templates/default/css/ie8.css<br />

我正在使用Nokogiri提取我需要的任何其他信息,但由于它们被包含在评论中,因此无法获取这些URL。

3 个答案:

答案 0 :(得分:2)

Nokogiri文档暗示它在文档中创建节点以表示注释(http://nokogiri.org/Nokogiri/XML/Comment.html),如果您可以获取这些节点的内容,那么您可以使用简单的RegExp来提取URL。

类似的东西:

/<link[^>]*?href="([^"]+)"/

答案 1 :(得分:2)

Nokogiri可以帮到你想要的地方。问题是comment节点的内容是文本,因此您必须重新分析该文本以继续使用Nokogiri的juju。

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<!--[if lt IE 7]>
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie6.css" />
<![endif]-->
<!--[if IE 7]>
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie7.css" />
<![endif]-->      
<!--[if IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="/templates/default/css/ie8.css" />
<![endif]-->
EOT

puts doc.search('//comment()').map{ |c|
  Nokogiri::HTML::DocumentFragment.parse( c.content ).at('link')['href']
}

哪个输出:

/templates/default/css/ie6.css
/templates/default/css/ie7.css
/templates/default/css/ie8.css

答案 2 :(得分:0)

非常确定

/href="(.+).css"/i 

可以正常工作