개발/Ruby

[Ruby] Nokogiri

팥빙구 2015. 3. 6. 11:14

공식사이트 http://www.nokogiri.org/


HTML/XML 관련 작업을 할 때 유용하다

XML 파싱을 할 때 사용해 보았는데 xpath 한 줄이면 정말 편리하게 xml을 긁어올 수 있다


공식 사이트에 가면 자세한 설명이 나와있지만 간단하게 설명해보자면

(mac OS X 10.10 기준)


1. Install (사이트에 가면 troubleshooting도 잘 나와 있음)


gem install nokogiri


2. Parsing


2.1 From a string


html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>") xml_doc = Nokogiri::XML("<root><aliens><alien><name>Alf</name></alien></aliens></root>")


2.2 From a file


f = File.open("blossom.xml") doc = Nokogiri::XML(f) f.close


2.3 From internets 


require 'open-uri' doc = Nokogiri::HTML(open("http://www.threescompany.com/"))


3. Basic Searching


3.1 예제 파일


[shows.xml] <root> <sitcoms> <sitcom> <name>Married with Children</name> <characters> <character>Al Bundy</character> <character>Bud Bundy</character> <character>Marcy Darcy</character> </characters> </sitcom> <sitcom> <name>Perfect Strangers</name> <characters> <character>Larry Appleton</character> <character>Balki Bartokomous</character> </characters> </sitcom> </sitcoms> <dramas> <drama> <name>The A-Team</name> <characters> <character>John "Hannibal" Smith</character> <character>Templeton "Face" Peck</character> <character>"B.A." Baracus</character> <character>"Howling Mad" Murdock</character> </characters> </drama> </dramas> </root>


3.2.  searcing using "xpath"


@doc = Nokogiri::XML(File.open("shows.xml")) @doc.xpath("//character") # => ["<character>Al Bundy</character>", # "<character>Bud Bundy</character>", # "<character>Marcy Darcy</character>", # "<character>Larry Appleton</character>", # "<character>Balki Bartokomous</character>", # "<character>John \"Hannibal\" Smith</character>", # "<character>Templeton \"Face\" Peck</character>", # "<character>\"B.A.\" Baracus</character>", # "<character>\"Howling Mad\" Murdock</character>"]


3.3. xpath는 실질적으로 스트링이 아닌 NodeSet을 반환한다. to_s method로 변환해줘야 한다. 


characters[0].to_s # => "<character>Al Bundy</character>"


3.4 다음과 같이도 searchiing 가능


@doc.xpath("//dramas//character") # => ["<character>John \"Hannibal\" Smith</character>", # "<character>Templeton \"Face\" Peck</character>", # "<character>\"B.A.\" Baracus</character>", # "<character>\"Howling Mad\" Murdock</character>"]


3.5. 위는 베이직한 사용법. 자세한 것은 사이트 참조


4. 팁

3.3에서 .to_s말고  .children.text 를 사용하면 태그를 제외한 스트링만 뽑아올 수 있다.








xml 파싱하는 다른 방법


We require in the 'rexml/document' module for parsing XML in ruby.

require "rexml/document"

file = File.open("pets.txt")

doc = REXML::Document.new file

file.close

doc.elements.each("pets/pet/name") do |element|

  puts element


end