【问题标题】:Get href tag inner text from html (html agility pack)从 html 获取 href 标记内部文本(html 敏捷包)
【发布时间】:2020-01-19 21:42:15
【问题描述】:

我成功地从下面的 html 中的所有 href 标记中提取文件名并将其添加到列表中。

HTML:

<ul class="resourcelist">
    <li><a href="/upload/Article/07.pdf" target="_blank"><img src="/assets/images/pdf.png" /> <strong>SPEC SHEET: </strong> d07</a></li>
    <li><a href="/upload/Article/73.pdf" target="_blank"><img src="/assets/images/pdf.png" /> <strong>ASSEMBLY SHEET: </strong> d73</a></li>
    <li><a href="/upload/Article/75.pdf" target="_blank"><img src="/assets/images/pdf.png" /> <strong>ASSEMBLY SHEET: </strong> d75</a></li>
    <li><a href="/upload/Article/71.pdf" target="_blank"><img src="/assets/images/pdf.png" /> <strong>INSTALLATION SHEET: </strong> d71</a></li>
</ul>

解析 html 的 C# 代码:

    public List<string> LinksList = new List<string>();
    public List<string> GetLinks()
        {
            var doc = new HtmlDocument();
            doc.LoadHtml(GetProductDescription("TechnicalSpecifications"));
            HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@href]");
            foreach (var node in nodes)
            {
                var href = node.Attributes["href"].Value.Split('/')[3];
                if (!LinksList.Contains(href))
                {
                    LinksList.Add(href);
                }

            }
            return LinksList;
        }

是否有任何可能的方法来定位从&lt;strong&gt; 开头的所有内容+关闭标签之前的文本? (基本上所有不在<...>中的东西)

我已经查看了关于 SO 的大量问题,但似乎没有什么可以解决这个问题。

输出示例:

规格表:d07

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您实际上只是在收集节点的内部文本。这样做:

    var texts = doc.DocumentNode
        .SelectNodes("//a[@href]")
        .Select(n => n.InnerText)
        .Distinct()
        .ToList();
    

    【讨论】:

    • 完美!谢谢杰夫!
    • 请问 .Cast 的目的是什么?我在这里看到它被引用:html-agility-pack.net/knowledge-base/655603/… 但它并没有具体谈论正在做什么。它正在处理 LINQ 到对象的转换?
    • @QHarr:实际上这里似乎不需要演员调用。也许从前,我上次使用 HtmlAgilityPack 已经很久了,或者我可能混淆了其他库的行为方式。如果我没记错的话,HtmlNodeCollection 仅实现(非通用)IEnumerable,它不适用于 linq。所以IEnumerable 必须是Cast&lt;&gt;()IEnumerable&lt;HtmlNode&gt;。但我想自从我上次记得以来这已经改变了。
    • @QHarr:所以看起来 1.4 之前的版本需要演员表。但我们现在是 1.11,那是很久以前的事了。
    猜你喜欢
    • 2012-04-17
    • 2012-01-19
    • 2012-04-27
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多