노코기리란?
TLDR;
Nokogiri는 일본의 당기는 톱입니다. 아...도와주지 않았어? 계속 읽으세요.
보석
Nokogiri는 Rails 앱의 Gemfiles에서 표준으로 제공됩니다. Bundler 오류에 나타나기 때문에 처음 알았습니다.
Nokogiri는 XML 및 HTML을 구문 분석하여 이러한 프로토콜을 Ruby에서 사용할 수 있도록 C, Java 및 Ruby로 작성된 종속성이 낮은 모듈입니다. 시작하자.
Nokogiri를 사용하여 HTML 구문 분석
Ruby를 사용하여 웹 페이지에서 데이터를 추출하시겠습니까?
먼저 실행
nokogiri -v
하고 버전 번호가 포함된 응답을 받는지 확인합니다. 그렇지 않으면 실행해야 합니다gem i nokogiri
.➜ ~ irb --simple-prompt
>> require 'nokogiri'
=> true
>> Nokogiri
=> Nokogiri
그것을 요구하는 것을 잊지 마십시오. 그렇지 않으면 초기화되지 않은 상수에 대해 NameError가 발생합니다.
먼저, 생성한 HTML을 구문 분석한 다음 실제 웹 페이지를 구문 분석합니다.
# First, put some valid html into a string.
>> html = "<h1>Hello World!</h1>
<section><h2>A List of Stuff</h2>
<ul><li>Camera</li>
<li>Computer</li>
<li>Television</li>
</ul></section>"
# Now pass that string into the HTML5 module as an argument
>> document = Nokogiri::HTML5(html)
다음과 같은 응답을 받아야 합니다.
=>
#(Document:0x4c4 {
name = "document",
children = [
#(Element:0x4d8 {
name = "html",
children = [
#(Element:0x4ec { name = "head" }),
#(Element:0x500 {
name = "body",
children = [
#(Element:0x514 {
name = "h1",
children = [ #(Text "Hello World!")]
}),
#(Element:0x528 {
name = "section",
children = [
#(Element:0x53c {
name = "h2",
children = [ #(Text "A List of Stuff")]
}),
#(Element:0x550 {
name = "ul",
children = [
#(Element:0x564 {
name = "li",
children = [ #(Text "Camera")]
}),
#(Element:0x578 {
name = "li",
children = [ #(Text "Computer")]
}),
#(Element:0x58c {
name = "li",
children = [ #(Text "Television")]
})]
})]
})]
})]
})]
})
Nokogiri의 HTML5 모듈은 우리의 HTML 문자열을 가져와 자체 메서드 집합이 있는 Document 클래스를 반환했습니다. 한 쌍을 봅시다. (항상
Document.methods.sort
를 사용하여 모든 방법을 나열할 수 있음을 기억하십시오.)문서#어린이
이것은 배열과 같은
XML::NodeSet
를 반환할 것입니다. 문자열에 포함하지 않은 <html>...</html>
요소이기 때문에 길이는 1뿐입니다. 이 자식에는 <head>...</head>
및 <body>...</body>
태그라는 두 개의 자식이 있습니다.>> body = document.children.children.last
=>
#(Element:0x80c {
...
>> ul = body.children.children.children
=> [#<Nokogiri::XML::Text:0x8c0 "A List of Stuff">, #<Nokogiri::XML::Elemen...
?> => [#<Nokogiri::XML::Text:0x8c0 "A List of Stuff">, #<Nokogiri::XML::Elemen..
.
>> >> ul.children.length
>> => 3
?> ?> ul.children.each do |child|
>> ?> puts child.text
>> >> end
>> Camera
>> Computer
>> Television
인터넷에서 HTML 구문 분석
인터넷은 구문 분석할 HTML 문서를 찾기에 좋은 장소라고 들었습니다. 터미널에서 클라이언트 URL 명령을 사용하여 이 HTML 중 일부를 캡처할 수 있습니다.
Ruby-Doc.org는 모든 Ruby 객체에 대해 배울 수 있는 훌륭한 리소스입니다.
이렇게 캡쳐합니다.
➜ ~ curl 'https://ruby-doc.org'
HTML이 터미널을 채우는 것을 보는 것도 좋지만 데이터를 사용하기 위해 Ruby 객체로 돌아올 때 훨씬 더 좋습니다. 그러기 위해서는 노코기리를 사용하자!
# You'll need the open-uri gem in addition to Nokogiri
# Open-uri allows you to open a URI as if it was a file in Ruby
>> require 'nokogiri'
=> true
>> require 'open-uri'
=> true
>> doc = Nokogiri::HTML5(URI.open('https://ruby-doc.org'))
=>
#(Document:0x9998 {
...
>>
이제
#css
메서드를 사용하여 요소 및 클래스별로 html을 쿼리할 수 있습니다.>> puts doc.css('h1')
<h1><a href="/">Ruby-Doc.org</a></h1>
=> nil
>> puts doc.css('p').first
<p>Help and documentation for the Ruby programming language.</p>
이 방법으로 클래스를 쿼리하십시오.
>> rails = Nokogiri::HTML5(URI('https://rubyonrails.org'))
=>
#(Document:0x1f1bc {
...
>> headline = rails.css('div.heading__headline')
=> [#<Nokogiri::XML::Element:0x1fb94 name="div" attributes=[#<Nokogiri::XML...
>> puts headline.text
Compress the complexity of modern web apps.
Learn just what you need to get started, then keep leveling up as you go. Ruby on Rails scales from HELLO WORLD to IPO.
You’re in good company.
Over the past two decades, Rails has taken countless companies to millions of users and billions in market valuations.
Building it together.
Over six thousand people have contributed code to Rails, and many more have served the community through evangelism, documentation, and bug reports. Join us!
Everything you need.
Rails is a full-stack framework. It ships with all the tools needed to build amazing web apps on both the front and back end.
Optimized for happiness.
Let’s get started.
엄청난! 이제 Nokogiri가 작동하는 방식에 대한 일반적인 아이디어를 얻었습니다!
이제 무료 보너스 콘텐츠를 위해...
웹 페이지의 콘텐츠를 검색해 봅시다. 예를 들어 이 글을 쓰는 시점이 농구 시즌이니 ESPN 홈페이지에 농구에 대한 이야기가 나오는지 봅시다.
>> espn = Nokogiri::HTML5(URI('https://www.espn.com'))
=>
#(Document:0x259e0 {
...
# For this we will use a Regular Expression (RegEx)
# The Regular Expression goes between forward slashes
# And the 'i' flag makes the search case-insensitive
>> espn.text.scan(/basketball/i).count
=> 32
당신은 그것을 가지고 있습니다! 그리고 우리는 ESPN이 홈페이지에서 농구를 32번 언급한다는 것을 알기 위해 웹사이트를 방문할 필요조차 없었습니다! 우와...
Reference
이 문제에 관하여(노코기리란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jvon1904/what-is-nokogiri-48m4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)