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
if (anchor_tags != null)
{
ExtractLinks_AnchorTags(anchor_tags);
}
if(audio_tags != null)
{
ExtractLinks_AudioTags(audio_tags);
}
if(embed_tags!=null)
{
ExtractLinks_EmbedTags(embed_tags);
}
if (iframe_tags != null)
{
ExtractLinks_iFrameTags(iframe_tags);
}
if (img_tags != null)
{
ExtractLinks_ImgTags(img_tags);
}
if (object_tags != null)
{
ExtractLinks_ObjectTags(object_tags);
}
if (video_tags != null)
{
ExtractLinks_ObjectTags(video_tags);
}
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?
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.
Der XPath-Ausdruck für iframe
Elemente mit einem src
Attribut lautet: //iframe[@src]