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

วิธีแยกวิเคราะห์ HTML ใน Ruby

คุณกำลังพยายามแยกวิเคราะห์ HTML ด้วย Ruby หรือไม่

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

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

เพราะ Ruby มีห้องสมุดที่ยอดเยี่ยมที่เรียกว่า Nokogiri ซึ่งทำให้ HTML แยกวิเคราะห์เดินเล่นในสวนสาธารณะ

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

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

gem install nokogiri

หากคุณมีปัญหาในการติดตั้งอัญมณี ให้ลองทำดังนี้:

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

วิธีการแยกหัวข้อ

จากนั้นสร้างสคริปต์ต่อไปนี้ ซึ่งมีข้อมูลโค้ด HTML พื้นฐานที่จะแยกวิเคราะห์โดย nokogiri .

เรียกใช้รหัสนี้เพื่อรับชื่อหน้า :

require 'nokogiri'

html        = "testactual content here..."
parsed_data = Nokogiri::HTML.parse(html)

puts parsed_data.title
=> "test"

หากคุณต้องการแยกวิเคราะห์ข้อมูลโดยตรงจาก URL แทนที่จะเป็นสตริง HTML…

คุณทำได้ :

require 'open-uri'

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

การดำเนินการนี้จะดาวน์โหลด HTML และรับชื่อ

ตอนนี้ :

ตั้งชื่อเรื่องได้ดี แต่คุณอาจต้องการดูตัวอย่างขั้นสูงเพิ่มเติม

ใช่ไหม

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

การแยก Anchor Links

หากคุณต้องการลิงก์ทั้งหมดจากหน้าเว็บก่อน คุณจะต้องมี HTML

คุณสามารถใช้ open-uri . เดียวกันได้ เทคนิคในการดาวน์โหลด HTML สำหรับเว็บไซต์สาธารณะใดๆ

จากนั้นแยกวิเคราะห์ด้วย Nokogiri เพื่อรับวัตถุเอกสาร

ถูกใจสิ่งนี้ :

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

document.class
# Nokogiri::HTML::Document

คุณสามารถสอบถามข้อมูลวัตถุนี้ด้วยวิธีใดวิธีหนึ่งจากสองวิธี:

  • การใช้การสืบค้น XPath
  • การใช้ตัวเลือก CSS

มาดูวิธีการทำสิ่งนี้โดยใช้ XPath กันก่อน

นี่คือรหัส :

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

มันทำอะไรได้บ้าง?

กรองแท็ก HTML ทั้งหมดในหน้าเว็บ และมอบสิ่งที่คุณต้องการให้กับคุณ

ในกรณีนี้คือแท็ก “a”

ซึ่งเป็นแท็กที่มีลิงก์ใน HTML

ตอนนี้ :

สิ่งที่คุณมีคืออาร์เรย์ของ Nokogiri::XML::Element เป็นตัวแทนของแท็กเหล่านี้

หากคุณต้องการรับ URL และข้อความของลิงก์ คุณสามารถทำได้:

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

การดำเนินการนี้จะพิมพ์ลิงก์ทั้งหมดบนหน้าจอของคุณ หนึ่งลิงก์ต่อบรรทัด

หากต้องการลบข้อมูลอื่นๆ แทนลิงก์ เช่น รายการรูปภาพที่มีอยู่ในหน้า คุณสามารถทำตามขั้นตอนเดียวกันได้

สิ่งเดียวที่คุณต้องเปลี่ยนคือประเภทของแท็กที่คุณต้องการ

ตัวอย่างเช่น :

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

โดยที่ img เป็นแท็ก HTML สำหรับรูปภาพ และ src เป็นแอตทริบิวต์ที่จัดเก็บ URL รูปภาพ

หากต้องการค้นหาตัวเลือก CSS และแอตทริบิวต์ที่ถูกต้อง ให้ใช้เครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์

การใช้ตัวเลือก CSS กับ Nokogiri

คุณสามารถใช้ตัวเลือก CSS ได้โดยแทนที่ xpath เมธอดด้วย css วิธีการ

นี่คือตัวอย่าง :

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

หมายเหตุ :ความแตกต่างระหว่าง at_css &css คืออันแรกส่งคืนองค์ประกอบที่ตรงกันครั้งแรกเท่านั้น แต่อันหลังส่งคืนองค์ประกอบที่ตรงกันทั้งหมด

การใช้ CSS ทำให้คุณได้ผลลัพธ์แบบเดียวกัน ประเด็นทั้งหมดคือการบอก Nokogiri ว่าองค์ประกอบ HTML ใดที่คุณต้องการใช้งาน

นักพัฒนาส่วนใหญ่คุ้นเคยกับ CSS มากกว่า XPath ดังนั้นคุณจึงต้องการใช้ CSS

สรุป

คุณสามารถค้นหาเอกสารประกอบของ Nokogiri ได้ที่นี่:

https://www.rubydoc.info/github/sparklemotion/nokogiri

คุณอาจชอบ:

รูปแบบสตริงทับทิม