2016-08-09 9 views
6

मैं एक वेब पेज को पार्स करना चाहता हूं, कुछ पदों पर एंकर डालना चाहता हूं और Dash के लिए डॉक्ससेट जेनरेट करने के लिए संशोधित डीओएम को दोबारा प्रस्तुत करना चाहता हूं। क्या यह संभव है?मैं html5ever के साथ किसी पृष्ठ को कैसे पार्स कर सकता हूं, डीओएम संशोधित कर सकता हूं, और इसे क्रमबद्ध कर सकता हूं?

html5ever में शामिल उदाहरणों से, मैं देख सकता हूं कि एक HTML फ़ाइल कैसे पढ़ा जाए और एक गरीब व्यक्ति के HTML आउटपुट को कैसे करें, लेकिन मुझे समझ में नहीं आता कि मैं RcDom ऑब्जेक्ट को पुनर्प्राप्त कैसे कर सकता हूं।

मैं RcDom पर एक एंकर तत्व (<a name="foo"></a>) डालने वाला एक स्निपेट देखना चाहता हूं।

नोट: यह जंग और एचटीएमएल 5 विशेष रूप से संबंधित प्रश्न है ... मुझे पता है कि इसे अन्य भाषाओं या सरल HTML पार्सर्स में कैसे करना है।

उत्तर

6

यहाँ कुछ कोड है कि एक दस्तावेज़ को पार्स करता है लिंक करने के लिए एक achor जोड़ता है और नए दस्तावेज़ प्रिंट:

extern crate html5ever; 

use html5ever::{ParseOpts, parse_document}; 
use html5ever::tree_builder::TreeBuilderOpts; 
use html5ever::rcdom::RcDom; 
use html5ever::rcdom::NodeEnum::Element; 
use html5ever::serialize::{SerializeOpts, serialize}; 
use html5ever::tendril::TendrilSink; 

fn main() { 
    let opts = ParseOpts { 
     tree_builder: TreeBuilderOpts { 
      drop_doctype: true, 
      ..Default::default() 
     }, 
     ..Default::default() 
    }; 
    let data = "<!DOCTYPE html><html><body><a href=\"foo\"></a></body></html>".to_string(); 
    let dom = parse_document(RcDom::default(), opts) 
     .from_utf8() 
     .read_from(&mut data.as_bytes()) 
     .unwrap(); 

    let document = dom.document.borrow(); 
    let html = document.children[0].borrow(); 
    let body = html.children[1].borrow(); // Implicit head element at children[0]. 

    { 
     let mut a = body.children[0].borrow_mut(); 
     if let Element(_, _, ref mut attributes) = a.node { 
      attributes[0].value.push_tendril(&From::from("#anchor")); 
     } 
    } 

    let mut bytes = vec![]; 
    serialize(&mut bytes, &dom.document, SerializeOpts::default()).unwrap(); 
    let result = String::from_utf8(bytes).unwrap(); 
    println!("{}", result); 
} 

यह प्रिंट निम्नलिखित:

<html><head></head><body><a href="foo#anchor"></a></body></html> 

आप देख सकते हैं, हम children विशेषता के माध्यम से बच्चे नोड्स के माध्यम से नेविगेट कर सकते हैं।

और हम Element के गुणों के वेक्टर में मौजूद एक विशेषता को बदल सकते हैं।

+0

बहुत बहुत धन्यवाद, बिल्कुल वही जो मैं उम्मीद कर रहा था। – kesselborn

+0

1 साल पुराना उत्तर, लेकिन मैंने आज इस कोड को आजमाया है और यह मेरे लिए संकलित करने में विफल रहता है। मैं जंग 1.20.0 पर हूं और html5ever के नवीनतम संस्करण का उपयोग कर रहा हूं। त्रुटि 'अनसुलझा आयात html5ever :: rcdom :: NodeEnum :: Element' है और यह कहता है कि इसे अब NodeEnum नहीं मिला है। क्या इसे बहिष्कृत किया गया था? क्या मैं कुछ भुल गया ? – ghlecl

संबंधित मुद्दे

 संबंधित मुद्दे