공식사이트 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