কম্পিউটার টিউটোরিয়াল

Nokogiri দিয়ে রুবিতে HTML পার্সিং: মাস্টার করুন

রুবিতে HTML পার্স করতে চাচ্ছেন? সঠিক টুল ছাড়া এই কাজটি কঠিন হতে পারে।

আপনার সুভাগ্যে, আজ আপনি লッキー! কারণ রুবিতে একটি চমৎকার লাইব্রেরি আছে Nokogiri নামের, যা HTML পার্সিংকে পার্কে ঘুরার মতো সহজ করে দিয়েছে।

চলুন কিছু উদাহরণ দেখি।

প্রথমে, nokogiri জেম ইনস্টল করুন:

gem install nokogiri

ইনস্টলে সমস্যা হলে এটি ট্রাই করুন:

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

টাইটেল এক্সট্র্যাক্ট করা

তারপর নিচের স্ক্রিপ্ট তৈরি করুন, যাতে একটি বেসিক HTML স্নিপেট থাকে যা nokogiri পার্স করবে।

পেজ টাইটেল পেতে এই কোড রান করুন:

require 'nokogiri'
html = "<title>test</title><body>actual content here...</body>"
parsed_data = Nokogiri::HTML.parse(html)
puts parsed_data.title
# => "test"

যদি HTML স্ট্রিংয়ের বদলে সরাসরি URL থেকে ডেটা পার্স করতে চান…

তবেও করতে পারেন:

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

এটি HTML ডাউনলোড করবে এবং আপনাকে টাইটেল দেবে।

এখন: টাইটেল পাওয়া ভালো, কিন্তু আপনি নিশ্চিতই আরও অ্যাডভান্সড উদাহরণ দেখতে চান। ঠিক না?

চলুন দেখি কীভাবে একটি ওয়েবসাইট থেকে লিংক এক্সট্র্যাক্ট করতে হয়।

এনকর লিংক এক্সট্র্যাক্ট করা

এক পেজ থেকে সব লিংক পেতে হলে প্রথমে 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 সিলেক্টর ও অ্যাট্রিবিউট খুঁজে বের করতে আপনার ব্রাউজারের ডেভেলপার টুলস ব্যবহার করুন।

Nokogiri-তে CSS সিলেক্টর ব্যবহার

CSS সিলেক্টর ব্যবহার করতে xpath মেথডের বদলে css মেথড ব্যবহার করুন।

উদাহরণ:

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

নোট: at_css ও css-এর পার্থক্য হলো প্রথমটি শুধু প্রথম ম্যাচ করা এলিমেন্ট রিটার্ন করে, কিন্তু পরেরটি সকল ম্যাচ করা এলিমেন্ট রিটার্ন করে।

CSS দিয়েও একই রেজাল্ট পাওয়া যায়, মূল উদ্দেশ্য হলো Nokogiri-কে বলা কোন HTML এলিমেন্টের সাথে কাজ করতে চান। অধিকাংশ ডেভেলপার XPath-এ চেয়ে CSS-এ বেশি পরিচিত, তাই CSS ব্যবহার করুন।

সারসংক্ষেপ

Nokogiri ডকুমেন্টেশন এখানে পাবেন: https://www.rubydoc.info/github/sparklemotion/nokogiri

আপনি এটাও পছন্দ করতে পারেন: রুবি স্ট্রিং ফরম্যাট

  1. HTML-এ <blockquote> ট্যাগ ব্যবহার করে দীর্ঘ উদ্ধৃতি দেওয়া

  2. রুবিতে এনভায়রনমেন্ট ভেরিয়েবল মাস্টার করুন: একটি প্র্যাকটিক্যাল গাইড

  3. রুবি ম্যাট্রিক্স বুঝতে: ডেফিনিশন, অ্যাপ্লিকেশন এবং কীভাবে তৈরি করবেন

  4. রুবি Struct ও OpenStruct: দক্ষ ভ্যালু অবজেক্টস