กำลังพยายาม 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 = "test actual 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