我试图解析一些返回的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>)/)
但我没有得到我想要的结果。有人能看出我的方法或正则表达式有问题吗?
5条答案
按热度按时间cfh9epnr1#
通常认为用RegExs解析HTML是非常糟糕的,因为HTML没有常规语法。请参阅此处的解释链接列表(一些来自SO)。
您应该使用指定的HTML库such as this
ifmq2ha22#
我没有读你发布的整个代码,因为它灼伤了我的眼睛。
该正则表达式正确匹配
<span>hello</span>
,但在<span>hello</span><span>there</span>
处失败,匹配整个字符串。记住,*
运算符是贪婪的,因此它将匹配可能的最长字符串。你可以通过使用.*?
来使它不贪婪,这应该会使它工作。但是,使用正则表达式来解析HTML代码并不明智。
1-你不能总是用正则表达式解析HTML。HTML不是常规的。
2-编写或维护正则表达式非常困难。
3-使用
<span><a href="</span>"></a></span>
这样的输入很容易破坏正则表达式。deikduxw3#
要使用Ruby解析HTML,请使用Nokogiri或hpricot。
sh7euo9m4#
(it看起来你发布的示例html实际上没有任何你试图匹配的模式的例子。
Alicia是正确的,针对html的正则表达式通常是一个坏主意,随着你的需求变得越来越复杂,它会崩溃。
也就是说,你的例子很简单。
如前所述,.* 通常是贪婪的(我希望必须考虑到这一点),但似乎在扫描中使用时,您不会得到贪婪的行为。我能够在一个文档中匹配其中的几个模式。
v6ylcynt5#
尝试Nokolexbor以获得优于Nokogiri的性能。