2016-11-02 3 views
0

나는 지금까지 해왔 던 프로그래밍 문제를 찾아내는 데 도움이 필요합니다.Ruby에서 HTML 구문 분석기 만들기

문제 설명 :

HTML 문서 (문자열)와 키워드 (또한 문자열)을 받아 루비에서 함수를 작성합니다. 이 함수는 키워드가 HTML 태그 안에 나타나지 않는 한 <body> 요소 뒤에 HTML 문자열에있는 키워드가 모두 발견 된 다음 태그에서 발견 된 문자열을 둘러싸고 키워드를 강조 표시합니다. 예를 들어,

<span style="background-color: blue; color: white">keyword</span> 

당신은 HTML 태그 내에서 발생하는 문자열을 강조하지 않도록주의해야합니다. 키워드는 예를 들어,``테이블 '', 당신은 이 마크 업 싶지 않을 것이다 :

<table width="100%" border="0"> 

지금까지했던 어떤 : 오류

puts "Welcome to the HTML keyword highlighter!" 
puts "Please Enter A Keyword: " 
keyword = gets.chomp 
canEdit = false 

infile = File.new("desktop/code.html", "r") 
outfile = File.new("Result.html", "w") 

infile.each{ |i| 
    if (i.include? "<body>") 
     canEdit = true 

    end 

    if (i.include? "</body>") 
     canEdit = false 
    end 

    if(canEdit == true) 
     keyword.gsub(keyword, "<span style=\"background-color: yellow; color: black\">#{keyword}</span>") 

    outfile.write i 
end 

outfile.close() 
infile.close() 
} 

현재 수신 :

HTML 키워드 하이 라이터에 오신 것을 환영합니다. 나는이 오류의 원인과 문제를 해결하기 위해 몇 가지 지침을 사용할 수 있는지 확실 해요

/Users/Eva/Desktop/Personal/part4_program.rb:16:in `each': closed stream (IOError) 

from /Users/Eva/Desktop/Personal/part4_program.rb:16:in `<main>' 

간단한 :

키워드를 입력하시기 바랍니다. 또한이 프로그램이 프로그래밍 문제에 대한 해답으로 올바른 방향으로 가고 있는지 궁금합니다. 나는 Nokogiri가 이미 자원으로 이용 가능하다는 것을 알고 있지만 더 나은 선택이 될 수 없다면 Nokogiri를 사용하지 않아야한다고 생각했습니다.

puts 'Welcome to the HTML keyword highlighter!' 
puts 'Please Enter A Keyword: ' 
keyword = gets.chomp 
can_edit = false 

infile = File.new('desktop/code.html', 'r') 
outfile = File.new('Result.html', 'w') 

infile.each {|i| 
    if i.include?('<body>') 
    can_edit = true 
    end 

    if i.include?('</body>') 
    can_edit = false 
    end 

    if can_edit 
    keyword.gsub(keyword, %Q[<span style="background-color: yellow; color: black">#{keyword}</span>]) 
    outfile.write i 
    end 

    outfile.close 
    infile.close 
} 

오류 메시지가 말한다 : 그래서

part4_program.rb:16:in `each': closed stream (IOError) 

, 무슨 일이 일어나고

+1

더 나은 옵션입니다. http://stackoverflow.com/a/1732454/438992 –

+0

왜 더 나아 졌습니까? 나는 그것을 성공시키지 않고 설치하려고 시도했다. 내가 설치하려고 할 때마다이 오류가 발생합니다 : 오류 : 보석을 실행하는 중 ...(Gem :: FilePermissionError) /Library/Ruby/Gems/2.0.0 디렉토리에 대한 쓰기 권한이 없습니다. – mm19

+0

YMMV하지만 설치에 도움이 될 수 있습니다. http://stackoverflow.com/questions/14607193/installing-gem-or-updating-rubygems-fails-with-permissions-error – orde

답변

2

I'm unsure what is causing the error and could use some guidance to fix the issue.

하자 먼저 무슨 일이 일어나고 있는지 더 명확하게 볼 수, 코드에 약간의 적절한 서식을 적용 닫힌 파일을 통해 each을 사용하여 반복하려고합니다. 왜 그런데? 자, 코드가 올바르게 들여 쓰기가되었으므로, close 반복자의 안에 infileoutfile모두를 쉽게 볼 수 있습니다. 이것은 모든 종류의 문제로 이어질 것입니다 : 여전히 반복되고 each 동안

  • 당신은 파일을 닫습니다. 이렇게하면 "each의 발 아래에서 양탄자를 잡아 당깁니다"라고 말합니다. 파일을 닫으면 파일을 반복 할 수 있습니까? each이 이것을 감지하고 좋은 오류 메시지와 깨끗한 이탈을 얻었 기 때문에 운이 좋았을 것입니다. 현재 읽고있는 반복기에서 파일을 닫으면 문제를 진단하는 데 많은 어려움과 어려움이 생길 수 있습니다.당신이, 당신은 아직도 당신이 반복을 통해 갈 때마다 시간 close를 호출하지만 이미 그 후 만 close 파일을 한 번에 할 수있는 운터으로부터 파일을 폐쇄하기 때문에
  • 하더라도 each하지 휴식을했다 닫히고 다시 닫을 수 없습니다.
  • 그리고 당신은 당신 writeoutfile에 파일을 여러 번 닫으 수 있지만, 이전 반복하는 동안 이미 close D를도 합니다. 닫힌 파일에는 쓸 수 없습니다.

I am also wondering if this program is heading in the right direction as an answer to the programming problem.

솔직히, 난 원격 당신이 뭘 하려는지 이해가 안 돼요. 그러나 나는 "아니오"라고 말할 것입니다, 당신은 올바른 방향으로 향하고 있지 않습니다.

  • 어떤 키워드가 table 경우 : 여기

    은 당신의 암호를 해독하는 간단한 방법 단지 몇입니까?

  • <body></body>이 같은 줄에 있으면 어떻게됩니까?
  • 키워드가 행에 <body>이지만 그 전에 표시되면 어떻게됩니까?
  • 누군가가 <BODY> 또는 <bOdY>을 대신 쓰면 어떻게 될까요?
  • 선택 태그는 무엇입니까?
  • Null 끝 태그는 어떻게됩니까?
  • 키워드가 댓글에 표시되면 어떻게 되나요?
  • 키워드가 태그 안에 있으면 어떻게 되나요?
  • 키워드가 속성 내에 표시되면 어떻게됩니까?
  • 키워드가 <script> 요소 안에 있으면 어떻게 되나요?
  • 키워드가 <style> 요소 안에 있으면 어떻게 되나요?
  • 키워드가 <![CDATA[ 섹션에 있으면 어떻게 될까요?

I know Nokogiri is already available as a resource but I had hoped not to have to use it unless its thought to be a better option.

HTML은 복잡합니다. 정말 복잡합니다. 실제로 은 실제로 복합체입니다. 매우 휠을 다시 발명해야하는 좋은 이유가 없으면 다른 사람이 이미 수행 한 작업을 다시 사용해야합니다. 너무 열심히 생각조차하지 않고 파서를 깨는 방법이 여섯 가지가 넘을 수 있었고, 심지어는 불쾌한 구석에 들어 가지 못했습니다. (내가 그들을 모르는 필요을하기 때문에 다른 사람이 이미 그들 모두를 알아 냈 때문에 그렇게하지 때문에 단순히 불쾌한 코너 케이스를 알고있다.) 프로그램의

두 기초가 추상화하고 있습니다 재사용. 재사용 가능한 추상화 생성 및 다른 프로그래머의 추상화 재사용.

+0

제 질문에 답변 해 주셔서 감사합니다. 네가 나와 ​​함께 모든 것을 다룰 때가 된 것을 고맙게 생각한다. 자신의 코드로이 작업을 수행 할 수 없다고 판단되면 Nokogiri를 확실히 사용합니다. 다시 한번 감사드립니다. – mm19