Ich versuche, die HTML-Antwort einer HTTP-Anfrage zu analysieren. Ich benutze hyper für die Anfragen und html5ever für das Parsen. Der HTML-Code wird ziemlich groß sein und ich muss ihn nicht vollständig analysieren - ich muss nur einige Daten von Tags identifizieren, damit ich sie lieber streamen würde. Konzeptionell möchte ich etwas tun wie:
%Vor%Was mir bisher eingefallen ist:
%Vor% Es scheint, read_to_end
ist die Methode Ich möchte die Antwort aufrufen, um die Bytes zu lesen, aber es ist mir unklar, wie dies an den HTML-Dokumentenleser weitergeleitet werden soll ... wenn das überhaupt möglich ist.
In der Dokumentation für parse_document
wird angegeben, dass from_utf8
oder from_bytes
if verwendet werden soll Die Eingabe ist in Bytes (was es ist).
Es scheint, dass ich eine Senke aus der Antwort erstellen muss, aber hier stehe ich fest. Es ist mir auch nicht klar, wie ich Ereignisse erstellen kann, um auf den Tag zu warten, an dem ich interessiert bin.
Ich habe dieses Beispiel von html5ever angeschaut, das zu tun scheint was ich will und läuft das DOM, aber ich kann dieses Beispiel nicht selbst ausführen - entweder ist es veraltet oder rendril / html5ever ist zu neu. Dies scheint auch den HTML-Code als Ganzes zu analysieren und nicht als Stream, aber ich bin mir nicht sicher.
Ist es möglich zu tun, was ich mit der aktuellen Implementierung dieser Bibliotheken machen möchte?
Entschuldigung für den Mangel an Tutorial-like Dokumentation für html5ever und Ranke ...
Wenn Sie nicht zu 100% sicher sind, dass Ihr Inhalt UTF-8 enthält, verwenden Sie from_bytes
und nicht from_utf8
. Sie geben etwas zurück, das TendrilSink
implementiert, wodurch Sie die Eingabe inkrementell (oder nicht) bereitstellen können.
Die Methode std::io::Read::read_to_end
benötigt &mut Vec<u8>
, also funktioniert sie nicht mit TendrilSink
.
Auf der niedrigsten Ebene können Sie die Methode TendrilSink::process
einmal pro &[u8]
chunk aufrufen und dann TendrilSink::finish
aufrufen.
Um dies nicht manuell zu tun, gibt es auch die Methode TendrilSink::read_from
, die &mut R where R: std::io::Read
benötigt. Da hyper::client::Response
implementiert Read
, können Sie verwenden:
Um über Ihre Frage hinauszugehen, ist RcDom
sehr minimal und existiert meistens, um html5ever zu testen. Ich empfehle stattdessen Kuchiki . Es hat mehr Funktionen (für Tree Traversal, CSS Selector Matching, ...) einschließlich optionaler Hyper-Unterstützung.
In Ihrem Cargo.toml
:
In Ihrem Code:
%Vor%versuche das hinzuzufügen:
%Vor%Parameter entsprechen der Kiste Dokumentation ...