【问题标题】:EOF with NokogiriEOF 与 Nokogiri
【发布时间】:2012-07-25 10:48:16
【问题描述】:

我在一个长循环中有以下行

page = Nokogiri::HTML(open(topic[:url].first)).xpath('//ul[@class = "pages"]//li').first

有时我的 Ruby 应用程序会崩溃,并在这一行中引发“到达文件末尾”异常。

我该如何解决这个问题?只是一个开始;提高;结束块?

是一个执行论坛备份的脚本,所以不跳过任何线程很重要。

提前致谢。

【问题讨论】:

    标签: ruby exception nokogiri eof


    【解决方案1】:

    除了@Phrogz 的出色建议(特别是关于at_css 的更简单表达),我将单独提取原始xml [内容]:

    page = if (content = open(topic[:url].first)).strip.length > 0
      Nokogiri::HTML(content).xpath('//ul[@class = "pages"]//li').first
    end
    

    【讨论】:

    • 感谢您的回复,但我先做next unless topic[:url].first.page_exists? '//ul[@class = "pages"]//li'page = Nokogiri::HTML(open(topic[:url].first)).xpath('//ul[@class = "pages"]//li').first。 #page_exists 是 String 的一个方法:begin !Nokogiri::HTML(open(self)).to_s.empty? rescue Exception => e false end
    【解决方案2】:

    我建议您首先解决根本问题,以免出现此错误。

    • 相同的 URL 是否总是导致问题? (在你的日志文件中输出。)如果是这样,也许你需要URI encode the URL
    • 它是随机的,因此可能与连接中断或服务器问题有关?如果是这样,您应该挽救具体错误,然后retry 一次或多次以获取关键数据。

    其次,您应该知道该查询的 CSS 语法要简单得多:

    page = Nokogiri.HTML(...).at_css('ul.pages li')
    
    • 这不仅小于字节的一半,而且还允许 XPath 错过像 <ul class="foo pages"> 这样的情况。
    • 使用at_css(或at_xpath)与.css(...).first 相同,但更快更简单。

    【讨论】:

    • 当然可能是服务器的限制(应用程序因调用#458而崩溃),但我不能确定这是真的……
    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多