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


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

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

  • 2016년 05월 22일에 작성됨

  • require 는 class위쪽 파일 윗부분에 놓는게 좋을 것 같아요. home#index가 호출 될때마다 require를 호출하게 되거든요    Carlos Yoo   2016.5.22 21:18     
조회수 495


1 답변


좋아요
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.

  • 2016년 05월 22일에 작성됨
    그렙에서 웹 프론트 개발을 하고 있습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close