ruby正则表达式,解析HTML

时间:2010-04-03 15:29:47

标签: ruby regex

我正在尝试解析一些返回的html(来自http://www.google.com/movies?near=37130)以查找当前正在播放的电影。我试图匹配的模式看起来像:
<span dir=ltr>Clash of the Titans</span>

其中有几个在返回的html中。

我正在尝试使用以下命令获取一系列电影片名:
titles = listings_html.split(/(<span dir=ltr>).*(<\/span>)/)

但我没有得到我期待的结果。任何人都可以看到我的方法或正则表达式的问题吗?

4 个答案:

答案 0 :(得分:5)

一般认为Verey Bad用RegEx解析HTML,因为HTML没有常规语法。请参阅解释链接列表(部分来自SO)here

您应该使用指定的HTML库such as this

答案 1 :(得分:4)

我没看过你发布的所有代码,因为它烧了我的眼睛。

<span>.*</span>

此正则表达式正确匹配<span>hello</span>,但在<span>hello</span><span>there</span>处失败并匹配整个字符串。请记住,*运算符是贪婪的,因此它将匹配可能的最长字符串。你可以使用.*?让它变得有效,使其变得非贪婪。

但是,使用正则表达式解析HTML代码并不明智。

1-您无法始终使用正则表达式解析HTML。 HTML不常见。

2-编写或维护正则表达式非常困难。

3-使用<span><a href="</span>"></a></span>等输入打破正则表达式很容易。

答案 2 :(得分:3)

要使用Ruby解析HTML,请使用Nokogirihpricot

答案 3 :(得分:2)

(您发布的示例html似乎没有任何您尝试匹配的模式示例。)

Alicia是正确的,反对html的正则表达式通常是一个坏主意,随着您的要求变得更加复杂,它将会崩溃。

那就是说,你的例子非常简单..

doc.scan(/<span dir=ltr>(.*)<\/span/) do |match|
   puts match               
end 

如前所述,。*通常是贪婪的(我预计必须考虑到这一点),但似乎在扫描中使用时,你不会有贪婪的行为。我能够在一个文档中匹配其中几种模式。