Rust में HTML पार्सिंग: टूल्स का अवलोकन और व्यावहारिक उदाहरण
Rust एक आधुनिक सिस्टम प्रोग्रामिंग भाषा है, जिसका उपयोग तेजी से उच्च-प्रदर्शन वाले वेब-स्क्रैपर्स और पार्सर्स बनाने के लिए किया जा रहा है। अपनी सख्त टाइप सिस्टम, मेमोरी सुरक्षा और एसिंक्रोनस क्षमताओं के कारण, Rust उन कार्यों के लिए आदर्श है जहाँ HTML दस्तावेज़ों से जल्दी और विश्वसनीय रूप से डेटा निकालने की आवश्यकता होती है। इस लेख में, हम Rust पर HTML पार्सिंग के लिए प्रमुख लाइब्रेरीज़, उनकी विशेषताओं की समीक्षा करेंगे और काम करने वाले कोड उदाहरण प्रस्तुत करेंगे।
Rust में HTML पार्सिंग के लिए मुख्य लाइब्रेरीज़
Rust का इकोसिस्टम HTML के साथ काम करने के लिए कई परिपक्व समाधान प्रदान करता है। सबसे लोकप्रिय हैं:
- scraper — CSS-सेलेक्टर्स के समर्थन वाली उच्च-स्तरीय लाइब्रेरी, जो
select.rsऔरhtml5everके ऊपर बनी है। - select.rs — CSS-सेलेक्टर्स का उपयोग करके DOM से डेटा निकालने के लिए लाइब्रेरी।
- html5ever — निम्न-स्तरीय पार्सर, जो HTML5 मानक के अनुरूप है (Servo के अंदर उपयोग किया जाता है)।
- quick-xml — स्ट्रीम-आधारित रीडिंग पर तेज़ XML/HTML पार्सर, सरल कार्यों के लिए उपयुक्त।
अधिकांश वेब-स्क्रैपिंग कार्यों के लिए scraper की सिफारिश की जाती है, क्योंकि यह एक सुविधाजनक API और सक्रिय सामुदायिक समर्थन प्रदान करता है।
स्थापना और सेटअप
Cargo.toml फ़ाइल में निर्भरता जोड़ें:
[dependencies]scraper = "0.20"reqwest = { version = "0.12", features = ["blocking"] }reqwest लाइब्रेरी HTTP अनुरोधों के लिए उपयोग की जाती है। यदि आप एसिंक्रोनस दृष्टिकोण पसंद करते हैं, तो tokio के साथ reqwest का उपयोग करें।
उदाहरण 1: पेज के शीर्षक निकालना
हम एक सरल पार्सर लिखेंगे जो वेब पेज से <title> शीर्षक और सभी <h1> शीर्षक प्राप्त करता है:
use scraper::{Html, Selector};
fn main() -> Result<(), Box<dyn std::error::Error>> { let html = r#" <html> <head><title>उदाहरण पेज</title></head> <body> <h1>पहला शीर्षक</h1> <h1>दूसरा शीर्षक</h1> </body> </html> "#;
let document = Html::parse_document(html);
// title निकालें let title_selector = Selector::parse("title").unwrap(); if let Some(title_element) = document.select(&title_selector).next() { let title_text = title_element.text().collect::().join(""); println!("पेज का शीर्षक: {}", title_text); }
// सभी h1 निकालें let h1_selector = Selector::parse("h1").unwrap(); for element in document.select(&h1_selector) { let text = element.text().collect::().join(""); println!("H1: {}", text); }
Ok(())} इस उदाहरण में हम स्थिर HTML पार्स कर रहे हैं। वास्तविक साइटों के लिए, HTML आमतौर पर HTTP अनुरोध के माध्यम से प्राप्त किया जाता है।
उदाहरण 2: HTTP अनुरोध के साथ वास्तविक साइट का पार्सिंग
अब हम पेज लोड करने और लिंक निकालने के लिए reqwest का उपयोग करेंगे:
use scraper::{Html, Selector};
fn main() -> Result<(), Box<dyn std::error::Error>> { let response = reqwest::blocking::get("https://www.rust-lang.org")?; let html = response.text()?;
let document = Html::parse_document(&html); let link_selector = Selector::parse("a[href]").unwrap();
println!("पेज पर लिंक:"); for link in document.select(&link_selector) { if let Some(href) = link.value().attr("href") { let text = link.text().collect::(); println!(" टेक्स्ट: '{}' -> URL: {}", text.trim(), href); } }
Ok(())} attr("href") विधि पर ध्यान दें — यह आपको मान प्राप्त करने की अनुमति देती है