【问题标题】:How to get img/src or a/hrefs using Html Agility Pack?如何使用 Html Agility Pack 获取 img/src 或 a/hrefs?
【发布时间】:2011-06-17 16:15:35
【问题描述】:

我想使用 HTML 敏捷包来解析 HTML 页面中的图像和 href 链接,但我对 XML 或 XPath 知之甚少。虽然在许多网站上查找了帮助文档,但我只能'没有解决问题。另外,我在VisualStudio 2005中使用C#。我只是不能说流利的英语,所以,我衷心感谢能写一些有用的代码的人。

【问题讨论】:

  • 还有,Html Agility Pack 可以解决相对路径吗?

标签: c# .net html html-parsing html-agility-pack


【解决方案1】:

后期发布,但这是对已接受答案的 2021 年更新(修复了 HtmlAgilityPack 所做的重构。

    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);
    string command = "";

    // The Xpath below gets images.  
    // It is specific to a site.  Yours will vary ...
    command = "//a[contains(concat(' ', @class, ' '), 'product-card')]//img";  
    List<string> listImages=new();
    foreach(HtmlNode node in doc.DocumentNode.SelectNodes(command))
    {
        //  Using "data-src" below, but it may be "src" for you
        listImages.Add(node.Attributes["data-src"].Value);
    }

【讨论】:

    【解决方案2】:
    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);
    
    string name = htmlDoc.DocumentNode
        .SelectNodes("//td/input")
        .First()
        .Attributes["value"].Value;
    

    来源: https://html-agility-pack.net/select-nodes

    【讨论】:

      【解决方案3】:

      您还需要考虑文档基础 URL 元素 (&lt;base&gt;) 和协议相关 URL(例如 //www.foo.com/bar/)。

      更多信息请查看:

      【讨论】:

        【解决方案4】:

        也许我在这里发布答案为时已晚。以下对我有用:

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

        【讨论】:

          【解决方案5】:

          示例和接受的答案是错误的。它不能与最新版本一起编译。我试试别的:

              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();
              }
          

          这对我有用。

          【讨论】:

            【解决方案6】:

            主页上的first example 的作用非常相似,但请考虑:

             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 类。

            【讨论】:

            • 我收到错误:DocumentElement 在 1.4.0.0 版本的 HtmlDocument 对象中不存在 HtmlAgilitypack foreach(HtmlNode 链接在 doc.DocumentNode.SelectNodes("//a[@href]"))链接.属性[“href”];
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-06-18
            • 1970-01-01
            • 1970-01-01
            • 2017-04-13
            • 1970-01-01
            • 2021-07-31
            • 1970-01-01
            相关资源
            最近更新 更多