別の依存関係が追加され、作業が遅くなるためです。物事をより複雑にします。さらに、このソリューションは HTML タグ以外にも適用できます。私の開始文字列と終了文字列は何でもかまいません。
スパイダーと Web サイト分析を作成する仕事に就くまでは、同じように考えていました。その後、大きな RSS 集約システムを作成しました。パーサーは、その狂気から抜け出す唯一の方法でした。それがなければ、作品は決して完成しなかったでしょう。
はい、正規表現は優れていて便利ですが、ドラゴンがあなたを待っています. たとえば、次の一般的な文字列は問題を引き起こします。
'<div class="the_class"><div class="inner_div">foo</div></div>'
正規表現/<div class="the_class">(.*?)<\/div>/m
は次を返します。
"<div class=\"the_class\"><div class=\"inner_div\">foo</div>"
この不正な形式のレンダリング可能な HTML:
<div class="the_class"><div class="inner_div">foo
さらに悪いです:
'<div class="the_class"><div class="inner_div">foo'[/<div class="the_class">(.*?)<\/div>/m]
=> nil
一方、パーサーは次の両方を処理できます。
require 'nokogiri'
[
'<div class="the_class"><div class="inner_div">foo</div></div>',
'<div class="the_class"><div class="inner_div">foo'
].each do |html|
doc = Nokogiri.HTML(html)
puts doc.at('div.the_class').text
end
出力:
foo
foo
はい、開始文字列と終了文字列は何でもかまいませんが、HTML/XML を解析するためのよく知られたツールがあり、タスクが大きくなるにつれて、正規表現を使用する際の弱点が明らかになります。
そして、はい、パーサーが失敗する可能性があります。私は RSS フィードを処理する必要がありましたが、これはひどく不正な形式であり、パーサーが爆発しましたが、少し前処理を行うことで問題が解決しました。