ruby正则表达式,解析html

zazmityj  于 2023-05-17  发布在  Ruby
关注(0)|答案(5)|浏览(118)

我试图解析一些返回的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>)/)
但我没有得到我想要的结果。有人能看出我的方法或正则表达式有问题吗?

cfh9epnr

cfh9epnr1#

通常认为用RegExs解析HTML是非常糟糕的,因为HTML没有常规语法。请参阅此处的解释链接列表(一些来自SO)。
您应该使用指定的HTML库such as this

ifmq2ha2

ifmq2ha22#

我没有读你发布的整个代码,因为它灼伤了我的眼睛。

<span>.*</span>

该正则表达式正确匹配<span>hello</span>,但在<span>hello</span><span>there</span>处失败,匹配整个字符串。记住,*运算符是贪婪的,因此它将匹配可能的最长字符串。你可以通过使用.*?来使它不贪婪,这应该会使它工作。
但是,使用正则表达式来解析HTML代码并不明智。
1-你不能总是用正则表达式解析HTML。HTML不是常规的。
2-编写或维护正则表达式非常困难。
3-使用<span><a href="</span>"></a></span>这样的输入很容易破坏正则表达式。

deikduxw

deikduxw3#

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

sh7euo9m

sh7euo9m4#

(it看起来你发布的示例html实际上没有任何你试图匹配的模式的例子。
Alicia是正确的,针对html的正则表达式通常是一个坏主意,随着你的需求变得越来越复杂,它会崩溃。
也就是说,你的例子很简单。

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

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

v6ylcynt

v6ylcynt5#

尝试Nokolexbor以获得优于Nokogiri的性能。

doc = Nokolexbor::HTML(your_html_string)
title = doc.css('span[dir=ltr]').map(&:text)

相关问题