C# 如何使用Html Agility Pack获取img/src或a/hrefs?

C# 如何使用Html Agility Pack获取img/src或a/hrefs?,c#,.net,html,html-parsing,html-agility-pack,C#,.net,Html,Html Parsing,Html Agility Pack,我想使用HTML agility pack解析HTML页面上的图像和href链接,但我对XML或XPath知之甚少。虽然在许多网站上查找了帮助文档,但我无法解决这个问题。此外,我在VisualStudio 2005中使用了C。而且我不能流利地说英语,所以,我衷心感谢能够编写一些有用代码的人。主页上的功能与此非常相似,但请考虑: HtmlDocument doc = new HtmlDocument(); doc.Load("file.htm"); // would need doc.Load

我想使用HTML agility pack解析HTML页面上的图像和href链接,但我对XML或XPath知之甚少。虽然在许多网站上查找了帮助文档,但我无法解决这个问题。此外,我在VisualStudio 2005中使用了C。而且我不能流利地说英语,所以,我衷心感谢能够编写一些有用代码的人。

主页上的功能与此非常相似,但请考虑:

 HtmlDocument doc = new HtmlDocument();
 doc.Load("file.htm"); // would need doc.LoadHtml(htmlSource) if it is not a file
 foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
 {
    string href = link["href"].Value;
    // store href somewhere
 }
所以你可以想象img@src,只需将每个
a
替换为
img
,将
href
替换为
src
。 您甚至可以简化为:

 foreach(HtmlNode node in doc.DocumentElement
              .SelectNodes("//a/@href | //img/@src")
 {
    list.Add(node.Value);
 }

有关相对url处理,请查看
Uri
类。

示例和接受的答案是错误的。它不使用最新版本编译。我试着做点别的:

    private List<string> ParseLinks(string html)
    {
        var doc = new HtmlDocument(); 
        doc.LoadHtml(html);
        var nodes = doc.DocumentNode.SelectNodes("//a[@href]");
        return nodes == null ? new List<string>() : nodes.ToList().ConvertAll(
               r => r.Attributes.ToList().ConvertAll(
               i => i.Value)).SelectMany(j => j).ToList();
    }
私有列表解析链接(字符串html)
{
var doc=新的HtmlDocument();
doc.LoadHtml(html);
var nodes=doc.DocumentNode.SelectNodes(“//a[@href]”);
返回节点==null?新列表():nodes.ToList().ConvertAll(
r=>r.Attributes.ToList().ConvertAll(
i=>i.Value)).SelectMany(j=>j.ToList();
}

这对我很有用。

也许我在这里发布答案太迟了。以下几点对我很有用:

var MainImageString  = MainImageNode.Attributes.Where(i=> i.Name=="src").FirstOrDefault();

您还需要考虑文档基URL元素(
)和协议相关URL(例如
//www.foo.com/bar/

有关更多信息,请查看:

  • 关于MDN的页面
  • 保罗·爱尔兰的文章
  • 关于堆栈溢出的讨论
  • MSDN页面
  • 讨论无堆栈溢出
资料来源:

还有,Html Agility Pack可以解决相对路径问题吗?我得到一个错误:1.4.0.0版HTMLDocumentPack foreach的HtmlDocument对象中不存在DocumentElement(doc.DocumentNode.SelectNodes中的HtmlNode链接(“//a[@href]”){HtmlAttribute att=link.Attributes[“href]”);
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);

string name = htmlDoc.DocumentNode
    .SelectNodes("//td/input")
    .First()
    .Attributes["value"].Value;