1. 避免不必要的DOM遍历
- 精准定位:尽量使用精准的XPath或CSS选择器。例如,如果你只需要提取文章标题,而标题在
<h1 class="article-title">
中,就使用 css('.article-title')
而不是先获取所有 h1
标签再筛选。
- 按需加载:不要一次性加载整个DOM树。如果文档很大,可以考虑使用
Nokogiri::XML::SAX::Parser
进行事件驱动的解析,只在需要的数据出现时进行处理。
2. 处理大型文档
- 分块读取:对于非常大的HTML文件,可以逐块读取而不是一次性加载到内存。在Ruby中可以使用
IO
的 readpartial
方法结合 Nokogiri
进行处理。
- 释放资源:及时释放不再使用的对象。例如,处理完一个文档后,将
Nokogiri::HTML
对象设置为 nil
,让垃圾回收机制回收内存。
代码示例
require 'nokogiri'
require 'open-uri'
# 避免不必要的DOM遍历示例
url = 'http://example.com'
html = open(url).read
doc = Nokogiri::HTML(html)
# 使用精准的CSS选择器提取数据
title = doc.css('.article-title').text
puts title
# 处理大型文档示例(分块读取)
file_path = 'large_file.html'
parser = Nokogiri::HTML::SAX::Parser.new do |handler|
handler.on_element(:h1) do |name, attrs|
puts "Found <h1> tag: #{attrs}" if attrs['class'] == 'article-title'
end
end
File.open(file_path) do |file|
while chunk = file.readpartial(1024)
parser.parse(chunk)
end
parser.finish
end