我正在使用htmlagilitypack来提取几个html标签。继承人我的工作:
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
其中decodeHTML是以字符串形式打包的html页面。之后,我检查上面的变量是否为空
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);
}
并且其中一些肯定是null,因为甚至没有调用大多数extractLinks方法。例如,当我正在访问你的时候。 c o m。有几个iframe标签,代码无法识别它们。
编辑:
当我删除时
"[@" + HTML.TAG_IFRAME_SRC + "]"
iframe被识别,但我只想提取带有src属性的iframe。什么是正确的xpath语法?
答案 0 :(得分:1)
HtmlAgilityPack不会加载iframe
元素的内容。
为了检查iframe
的内容,请阅读src
属性(代表iframe
的URI)并执行单独的Web请求以将其加载到单独的HtmlDocument
。
一路上,请注意这些可能的问题:
src
属性可能包含相对URI。例如,如果您访问http://www.example.com
并看到iframe
有src="/samplePage"
,则应首先将其转换为绝对URI(在本例中为http://www.example.com/samplePage
)
某些iframe
元素可能没有src
标记,因为它是在浏览器中呈现文档时通过javascript动态添加的。也可以使用javascript创建整个iframe
元素,如果只是常规HttpWebRequest
,您甚至都看不到这些元素。在这种情况下,您必须分析页面上存在的javascript并在程序中复制该逻辑。
具有iframe
属性的src
元素的XPath表达式为://iframe[@src]