【问题标题】:Nokogiri method errorNokogiri方法错误
【发布时间】:2016-11-03 20:08:49
【问题描述】:

我正在使用 Nokogiri 作为工具来帮助我完成我正在为学校工作的项目。目前,该项目的想法是在 HTML 文档中搜索用户提供的关键字。该函数将在 <body> 元素之后的 HTML 字符串中查找所有出现的关键字,除非该关键字出现在 HTML 标记中,然后用标记包围找到的字符串以“突出显示”关键字。现在我的代码失败了,错误调用堆栈非常大。主要错误是这样的: Nokogiri::CSS::SyntaxError:unexpected'$'after''[:substring_match,"simple"]'(Nokogiri::CSS::SyntaxError)

我目前的方法:

require 'nokogiri'

file = File.open ("desktop/Personal/code.HTML")

@doc = Nokogiri::HTML(file)

puts @doc

puts "Welcome to the HTML keyword highlighter!"
puts "Please enter a keyword"
keyword = gets.chomp

highlight = "<span style='background-color: yellow; color: black'>#{keyword}</span>"

search = @doc.xpath("//body").search("[text()*=#{keyword}")

search.each do |node|
    nodeN = node.name
    nodeH = node.content.gsub(keyword, highlight)
    node.replace(nodeH)
end
file.close

错误调用堆栈:

     /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2. 0.0/gems/nokogiri-1.5.6/lib/nokogiri/css/parser_extras.rb:87:in `on_error': unexpected '$' after '[:substring_match, "simple"]' (Nokogiri::CSS::SyntaxError)
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/racc/parser.rb:258:in `_racc_do_parse_c'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/racc/parser.rb:258:in `do_parse'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/css/parser_extras.rb:62:in `parse'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/css/parser_extras.rb:79:in `xpath_for'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/css.rb:23:in `xpath_for'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:111:in `block (2 levels) in css'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:109:in `map'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:109:in `block in css'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:239:in `block in each'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:238:in `upto'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:238:in `each'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:105:in `css'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:81:in `block in search'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:80:in `each'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/gems/2.0.0/gems/nokogiri-1.5.6/lib/nokogiri/xml/node_set.rb:80:in `search'
    from /Users/Eva/Desktop/Personal/Project_Nokogiri.rb:21:in `<main>'

任何关于如何防止这种情况的建议将不胜感激!我是编程、Ruby 和 Nokogiri 的新手,所以我对如何自己解决这个问题知之甚少。如果格式不好,请见谅。感谢您的帮助!

【问题讨论】:

    标签: ruby nokogiri


    【解决方案1】:

    你忘了关闭方括号:

    search = @doc.xpath("//body").search("[text()*=#{keyword}]")
    

    我会添加引号以防万一:

    search = @doc.xpath("//body").search("[text()*=\"#{keyword}\"]")
    

    (如果双引号在 keyword 中,您也可以通过确保双引号被转义来扩展它以使其防弹)

    【讨论】:

    • 哦,谢谢!我会看几个小时却从未意识到!最后一个问题,如果你不介意的话。现在该方法更改了原始 HTML 文件我如何让它改为创建一个新文件并将更改应用到该文件?
    • 不,现在它什么都不做:文档被更改,然后程序退出,丢弃它在内存中的更改。要保存,File.write('newfile.xml', @doc.to_xml).
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2011-12-06
    • 1970-01-01
    • 2015-05-15
    • 2014-08-18
    • 2018-07-30
    相关资源
    最近更新 更多