Sto tentando di analizzare la risposta HTML di una richiesta HTTP. Sto usando hyper per le richieste e html5ever per l'analisi. L'HTML sarà abbastanza grande e non ho bisogno di analizzarlo completamente - ho solo bisogno di identificare alcuni dati dai tag quindi preferirei trasmetterli in streaming. Concettualmente voglio fare qualcosa di simile:Analisi del contenuto di una pagina HTML in uno stream con hyper e html5ever
# bash
curl url | read_dom
/* javascript */
http.get(url).pipe(parser);
parser.on("tag", /* check tag name, attributes, and act */)
Quello che ho elaborato finora è:
extern crate hyper;
extern crate html5ever;
use std::default::Default
use hyper::Client;
use html5ever::parse_document;
use html5ever::rcdom::{RcDom};
fn main() {
let client = Client::new();
let res = client.post(WEBPAGE)
.header(ContentType::form_url_encoded())
.body(BODY)
.send()
.unwrap();
res.read_to_end(parse_document(RcDom::default(),
Default::default().from_utf8().unwrap()));
}
Sembra read_to_end
è il metodo che voglio chiamare sulla risposta di leggere i byte , ma non è chiaro come inserirlo nel lettore di documenti HTML ... se è possibile.
The documentation for parse_document
dice di utilizzare from_utf8
o from_bytes
se l'ingresso è in byte (che è).
Sembra che ho bisogno di creare un sink dalla risposta, ma questo è dove sono bloccato. Non è chiaro per me come posso creare eventi per ascoltare l'inizio del tag, che è quello che mi interessa.
Ho guardato allo this example of html5ever che sembra fare quello che voglio e cammina sul DOM, ma non posso ottenere questo esempio per eseguire - o è obsoleto o tendril/html 5ever è troppo nuovo. Questo sembra anche analizzare l'HTML nel suo insieme piuttosto che come un flusso, ma non ne sono sicuro.
È possibile fare ciò che voglio fare con l'implementazione corrente di queste librerie?
Can mi colleghi più informat a proposito di Kuchiki piace come implementare l'attraversamento di alberi e in particolare come utilizzare eventi come "tag aperti" per ispezionare tag/contenuti di testo? Questo è quello che devo fare. –
Sembra che la [documentazione] (https://simonsapin.github.io/kuchiki/kuchiki/struct.Node.html) sia bacata, ci sono altri metodi che non vengono visualizzati qui. Ad esempio, i nodi hanno metodi come '.descendants()' e '.inclusive_descendants()' che restituiscono iteratori di nodi. Non sono sicuro di cosa intendi con "tag aperto". Kuchiki non è basato sugli eventi, si ottiene una struttura dei dati dell'albero una volta che l'analisi è stata eseguita. –
Grazie. Peccato se deve analizzare l'intero documento in una sola volta. Voglio qualcosa come [htmlparser2 per il nodo] (https://github.com/fb55/htmlparser2) dove posso reindirizzare un flusso di html al parser e rispondere a 'onstarttag', ecc. –