HTMLAgilityPack SelectNodes 选择所有 <img> 元素

Posted

技术标签:

【中文标题】HTMLAgilityPack SelectNodes 选择所有 <img> 元素【英文标题】:HTMLAgilityPack SelectNodes to select all <img> elements 【发布时间】:2011-12-14 13:39:58 【问题描述】:

我正在用 C# 制作一个项目,它基本上是一个用于图像搜索相关游戏的图像屏幕抓取工具。我正在尝试使用 htmlAgilityPack 选择所有图像元素并将它们放在 HTMLNodeCollection 中,如下所示:

//set up for checking autos

HtmlNodeCollection imgs = new HtmlNodeCollection(doc.DocumentNode.ParentNode);
imgs = doc.DocumentNode.SelectNodes("//img");

foreach (HtmlNode img in imgs)

    HtmlAttribute src = img.Attributes["@src"];
    urls.Add(src.Value);

注意 urls 是一个公共的 List 集合:

public List<string> urls = new List<string>();

我的 foreach 循环抛出异常:

对象引用未设置为对象的实例。

检查汽车,果然,imgs 为空。有没有更好的方法可以追踪这个问题的根源?我不知道是我的 Xpath 还是什么。

最令人沮丧的部分是我已经让它工作了,但是弄乱了我的文件版本并丢失了我的工作。得了。

【问题讨论】:

你在哪里加载HtmlDocument....你使用的是Load()还是LoadHtml() 【参考方案1】:

您可能在以下行中有错字:

HtmlAttribute src = img.Attributes["@src"];

我得到这个为我工作(注意@位置):

HtmlAttribute src = img.Attributes[@"src"];

【讨论】:

【参考方案2】:

这对我有用。我认为您的文档未正确加载,因此 xpath 不返回任何匹配项。

HtmlDocument htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml("<html><head></head><body><div><img /><div><img /><img/></div></div><img/></body></html>");

var nodes = htmlDocument.DocumentNode.SelectNodes("//img");
// 4 nodes found
foreach (var node in nodes)

    // do stuff

【讨论】:

有趣的测试方法。谢谢。 没问题,很高兴能帮上忙。

以上是关于HTMLAgilityPack SelectNodes 选择所有 <img> 元素的主要内容,如果未能解决你的问题,请参考以下文章

忽略解析错误 HTMLAgilityPack?

HtmlAgilityPack - 找不到文件

使用 HtmlAgilityPack 删除属性

黄聪:HtmlAgilityPack教程案例

HtmlAgilityPack 设置节点 InnerText

htmlagilitypack - 删除脚本和样式?