Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ HTML Parsing ใน Ruby ด้วย Nokogiri

กำลังพยายาม parse HTML ด้วย Ruby?

งานนี้อาจยาก ถ้าไม่มีเครื่องมือที่เหมาะสม

แต่วันนี้คุณโชคดี!

เพราะ Ruby มี library สุดเยี่ยมชื่อ Nokogiri ทำให้ HTML parsing ง่ายมาก

มาดูตัวอย่างกัน

ขั้นแรก ติดตั้ง nokogiri gem:

 gem install nokogiri 

ถ้าติดตั้ง gem ไม่ได้ ลอง:

 gem install nokogiri -- --use-system-libraries 

วิธีดึง Title

สร้าง script นี้ มี HTML snippet พื้นฐาน ให้ Nokogiri parse

รันโค้ดนี้เพื่อดึง page title:

 require 'nokogiri' html = "testactual content here..." parsed_data = Nokogiri::HTML.parse(html) puts parsed_data.title => "test" 

อยาก parse จาก URL โดยตรง แทน HTML string?

ทำได้แบบนี้:

 require 'open-uri' Nokogiri::HTML.parse(open('https://example.com')).title 

จะดาวน์โหลด HTML และดึง title ให้

ตอนนี้:

ดึง title แล้วแต่คุณต้องการตัวอย่างขั้นสูงกว่านี้ สิ?

มาดูวิธีดึง links จากเว็บไซต์

การดึง Anchor Links

อยากได้ links ทั้งหมดจากหน้า ต้องมี HTML ก่อน

ใช้ open-uri ดาวน์โหลด HTML จากเว็บสาธารณะ

Parse ด้วย Nokogiri ได้ document object

แบบนี้:

 document = Nokogiri::HTML.parse(open('https://example.com')) document.class # Nokogiri::HTML::Document 

Query object นี้ได้ 2 วิธี:

  • XPath queries
  • CSS selectors

ลอง XPath ก่อน

โค้ด:

 tags = document.xpath("//a") 

ทำอะไร? กรอง HTML tags ทั้งหมดในหน้า ให้ tags ที่ต้องการ

ในที่นี้คือ "a" tags — tags ที่เก็บ links ใน HTML

ตอนนี้:

ได้ array ของ Nokogiri::XML::Element แทน tags นี้

อยากได้ link URL และ text ทำได้:

 tags.each do |tag| puts "#{tag[:href]}\t#{tag.text}" end 

จะพิมพ์ links ทั้งหมด ทีละบรรทัด

อยาก scrape ข้อมูลอื่น เช่น รูปภาพ ทำ process เดียวกัน

เปลี่ยนแค่ tag type ที่ต้องการ

ตัวอย่าง:

 tags = document.xpath("//img") images_urls = tags.map { |t| t[:src] } 

img คือ HTML tag สำหรับรูป src คือ attribute เก็บ URL รูป

หา CSS selector และ attributes ที่ถูกต้อง ด้วย developer tools ของ browser

ใช้ CSS Selectors กับ Nokogiri

ใช้ CSS selectors แทน xpath ด้วย css method

ตัวอย่าง:

 headers = document.css("h1") paragraphs = document.css("p") 

หมายเหตุ: ความต่าง at_css และ css คือ at_css คืนแค่ element แรกที่ match ส่วน css คืน ทุก elements ที่ match

CSS ให้ผลลัพธ์เดียวกัน จุดสำคัญคือบอก Nokogiri ว่าอยากทำงานกับ HTML elements ไหน

Developer ส่วนใหญ่คุ้น CSS มากกว่า XPath จึงนิยมใช้ CSS

สรุป

เอกสาร Nokogiri: https://www.rubydoc.info/github/sparklemotion/nokogiri

อาจสนใจ: Ruby string format