Extrahieren aller iframe-Tags mit htmlagilitypack

c# html html-agility-pack

Frage

Ich verwende htmlagilitypack um mehrere HTML-Tags zu extrahieren. Heres was ich mache:

        HtmlDoc = new HtmlDocument();
        StringReader sr = new StringReader(decodedHTML);
        HtmlDoc.Load(sr);
        sr.close();
        var anchor_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_ANCHOR + "[@" + HTML.ATTRIBUT_HREF + "]");
        var embed_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_EMBED + "[@" + HTML.TAG_EMBED_SRC + "]");
        var iframe_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IFRAME + "[@" + HTML.TAG_IFRAME_SRC + "]");
        var img_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IMG + "[@" + HTML.TAG_IMG_SRC + "]");
        var audio_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_AUDIO);       // may contain inner-html
        var object_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_OBJECT);     // may contain inner-html
        var video_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_VIDEO);       // may contain inner-html

Wo decodiertHTML ist die HTML-Seite in einer Zeichenfolge gepackt. Danach untersuche ich, ob die obigen Variablen null sind

        HtmlDoc = new HtmlDocument();
        StringReader sr = new StringReader(decodedHTML);
        HtmlDoc.Load(sr);
        sr.close();
        var anchor_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_ANCHOR + "[@" + HTML.ATTRIBUT_HREF + "]");
        var embed_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_EMBED + "[@" + HTML.TAG_EMBED_SRC + "]");
        var iframe_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IFRAME + "[@" + HTML.TAG_IFRAME_SRC + "]");
        var img_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_IMG + "[@" + HTML.TAG_IMG_SRC + "]");
        var audio_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_AUDIO);       // may contain inner-html
        var object_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_OBJECT);     // may contain inner-html
        var video_tags = HtmlDoc.DocumentNode.SelectNodes("//" + HTML.TAG_VIDEO);       // may contain inner-html

und einige von ihnen sind definitiv null, weil die meisten extractLinks-Methoden nicht einmal aufgerufen werden. Zum Beispiel wenn ich Youtube besuche. com. Es gibt mehrere iframe-Tags und der Code erkennt sie nicht.

bearbeiten:

Wenn ich die "[@" + HTML.TAG_IFRAME_SRC + "]" lösche, werden die Iframes erkannt, aber ich möchte nur die Iframes mit einem src-Attribut extrahieren. Was ist die korrekte XPath-Syntax dafür?

Akzeptierte Antwort

HtmlAgilityPack lädt den Inhalt von iframe Elementen nicht.

Um den Inhalt eines iframe zu prüfen, lesen Sie das src Attribut (das den iframe -URI darstellt) und führen Sie eine separate HtmlDocument , um diese in ein separates HtmlDocument zu laden.

Beachten Sie auf dem Weg diese möglichen Probleme:

  • Das src Attribut kann einen relativen URI enthalten. Wenn Sie beispielsweise http://www.example.com besuchen und sehen, dass ein iframe src="/samplePage" , sollten Sie diesen zuerst in einen absoluten URI (in diesem Fall http://www.example.com/samplePage konvertieren http://www.example.com/samplePage )

  • Es ist möglich, dass einige iframe Elemente kein src Tag haben, da es dynamisch über Javascript hinzugefügt wird, wenn das Dokument in einem Browser gerendert wird. Es ist auch möglich, komplette iframe Elemente mit JavaScript zu erstellen, Elemente, die Sie nicht sehen würden, wenn Sie nur eine normale HttpWebRequest . In solchen Fällen müssen Sie das auf der Seite vorhandene Javascript analysieren und diese Logik in Ihrem Programm duplizieren.

Aktualisieren

Der XPath-Ausdruck für iframe Elemente mit einem src Attribut lautet: //iframe[@src]




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum