HTML-Seiteninhalt in einem Stream mit hyper und html5ever analysieren

8

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?

    
Explosion Pills 26.02.2016, 14:38
quelle

2 Antworten

7

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:

%Vor%

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 :

%Vor%

In Ihrem Code:

%Vor%     
Simon Sapin 26.02.2016, 20:02
quelle
-3

versuche das hinzuzufügen:

%Vor%

Parameter entsprechen der Kiste Dokumentation ...

    
Ivan Temchenko 26.02.2016 20:03
quelle

Tags und Links