웹크롤링 한글 깨짐 질문이요.

조회수 4441회
class HomeController < ApplicationController

    def index
    require 'open-uri'
  require 'nokogiri'

  @url ="http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=105&oid=030&aid=0002480868"
  @page = Nokogiri::HTML(open(@url), nil, 'EUC-KR')

  @title = @page.search("title").inner_html

@title_edit = @title.split(':')[0]
@content = @page.at_css('div.article_body').inner_html
   end
end

위와 같이 코드를 짰는데요. 아래와 같이한글이 다 깨져서 나와요. 어떻게 해야 될지 모르겠어요.ㅠ이미지

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • require 는 class위쪽 파일 윗부분에 놓는게 좋을 것 같아요. home#index가 호출 될때마다 require를 호출하게 되거든요 유연수 2016.5.22 21:18

1 답변

  • inner_html 대신에 text를 사용해 보세요.

    한글이 깨지는 원인은 클로링 한 문서의 인코딩은 EUC-KR인데 크롤한 데이터를 읽어서 화면을 구성하는 쪽에서 사용하는 인코딩이 UTF-8이기 때문입니다.

    nokogiri 문서에 따르면,

    1. text를 반환하는 .text등의 메소드는 UTF-8로 인코딩 된 문자열을 반환합니다.
    2. xml을 반환하는 .innerHTML 등의 메소드는 파싱에 사용된(위의 경우 EUC-KR) 인코딩으로 인코딩 된 데이터를 반환합니다.

    따라서 inner_html 대신에 text 메소드를 사용하시면 파싱된 데이터와 웹페이지에 사용하는 인코딩이 모두 UTF-8로 통일되기 때문에 문제가 해결됩니다.

    parsing_an_html_xml_document

    Strings are always stored as UTF-8 internally. Methods that return text values will always return UTF-8 encoded strings. Methods that return XML (like to_xml, to_html and inner_html) will return a string encoded like the source document.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)