2016-11-03 12 views
1

私は学校で働いているプロジェクトで私を助けるためのツールとしてNokogiriを使用しています。今、プロジェクトのアイデアは、ユーザーが提供するキーワードをHTML文書で検索することです。この関数は、キーワードがHTMLタグ内に表示されない限り、<body>要素の後のHTML文字列内のすべてのキーワードの出現を検索し、見つかった文字列を囲みキーワードを強調表示します。今、私のコードはかなり重大なエラー呼び出しスタックで失敗しています。主なエラーは、このです: 鋸山:: CSS ::にSyntaxError:予期しない '$' 'の後に' [:substring_match、 "シンプル"] '(鋸山:: CSS ::にSyntaxError)Nokogiriメソッドエラー

私の現在の方法:

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を初めて使うので、これを自分で修正する方法はほとんど分かりません。フォーマットが悪い場合はごめんなさい。何か助けてくれてありがとう!

答えて

1

あなたは角括弧を閉じるのを忘れ:

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

私は念のために引用符を追加したい:

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

(あなたがそれた場合にも二重引用符を確保することでエスケープされていること展開されます防弾にするためにkeywordにあります)

+0

ありがとうございます!私はそれを何時間も見て、実現しなかったでしょう!あなたが気にしないなら最後の1つの質問。今、このメソッドはオリジナルのHTMLファイルを変更して、代わりに新しいファイルを作成し、そのファイルに変更を適用する方法を教えてください。 – mm19

+0

いいえ、今はソートの何もしません:ドキュメントが変更され、プログラムが終了し、メモリ内の変更を破棄します。 'File.write( 'newfile.xml'、@ doc.to_xml)を保存します。 – Amadan