因为它增加了另一个依赖并减慢了我的工作。让事情变得更复杂。此外,此解决方案不仅适用于 HTML 标签。我的开始和结束字符串可以是任何东西。
在我找到一份编写蜘蛛和网站分析的工作之前,我以前也是这样想的,然后编写了一个大型的 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 提要,但是一些预处理解决了这个问题。