【问题标题】:Use Tempfile twice?使用 Tempfile 两次?
【发布时间】:2011-11-07 01:18:14
【问题描述】:

我在一个简单的程序上遇到了一个问题,我认为它与 Tempfiles 有什么关系。我正在使用“open-uri”和“nokogiri”,并尝试对文档进行正则表达式搜索以及使用 nokogiri 进行 xpath 搜索。但是,如果不对文档提出两个单独的请求并因此创建两个单独的临时文件,我似乎无法做到这一点。这有效,但提出了两个请求:

require 'open-uri'
require 'nokogiri'

source_url = "http://foo.com/"
#grab html document and assign it a variable
doc = open(source_url)
#grab html document, convert to Nokogiri object and assign to variable.
noko_doc = Nokogiri::HTML(open(source_url))

#create array of stuff. 
foo = noko_doc.xpath("//some element").collect { |e| e }
#create another array of stuff
bar = []
doc.each do |f|
    f.each do |line|
        abstract_matches = line.scan(/some regex string/)                                  
        unless abstract_matches.empty?
            abstract_matches.collect! do |item|
                if item.to_s.match(/yet another regex string/) 
                    item
                end
            end.compact!
            unless abstract_matches.empty?
                abstract_matches.each { |match| bar << "#{ match } / " }
            end
        end
    end
end
#all for this
puts foo + bar

如果我可以将“doc”变量传递到 Nokogiri::HTML 并对其进行迭代,我会更愿意。帮忙?

【问题讨论】:

    标签: ruby-on-rails ruby parsing nokogiri open-uri


    【解决方案1】:

    迭代 Tempfile 并不常见。更常见的是这样访问:

    html = open(source_url).read
    noko_doc = Nokogiri::HTML(html)
    html.split("\n").each do |line|
      # do stuff
    end
    

    【讨论】:

      【解决方案2】:

      您可以从字符串中解析 HTML,请参阅 the tutorial

      您不能将doc 放入一个字符串并让Nokogiri 从中解析吗?

      【讨论】:

      • 已解决。在迭代之前调用 doc.rewind。找不到很多好的文档,但这里有一个例子:techotopia.com/index.php/Working_with_Files_in_Ruby.rewind 带你回到文件的第一行。
      • FWIW,我同意戴夫的观点。临时文件并没有真正做任何事情,只是让事情变得复杂。此外,您要非常小心 open-uri...根据我们的经验,在生产中,它会留下临时文件,这会填满我们服务器的硬盘。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多