如何获取在 html 敏捷包中没有 class 或 id 的标签的值?

how to get value of a tag that has no class or id in html agility pack?

我正在尝试获取此标签的文本值:

<a href="item?id=22513425">67&nbsp;comments</a>

所以我想从中得到“67”。但是没有定义 类 或 id。

我已经做到了这一点:

        IEnumerable<HtmlNode> commentsNode = htmlDoc.DocumentNode.Descendants(0).Where(n => n.HasClass("subtext"));

        var storyComments = commentsNode.Select(n =>
            n.SelectSingleNode("//a[3]")).ToList();

这只会让我 "comments" 够烦人的。

我不能使用 href id,因为有很多这样的项目,所以我不能硬编码 href

我怎样才能提取号码?

只需使用@href 属性和专用的字符串函数:

substring-before(//a[@href="item?id=22513425"],"comments")

returns67.

编辑:由于您无法对@href 的所有内容进行硬编码,也许您可​​以使用starts-with。 XPath 1.0 解决方案。

最短形式(+ 文本必须包含 "comments"):

substring-before(//a[starts-with(@href,"item?") and text()[contains(.,"comments")]],"c")

更严格(+ 文本必须以 "comments" 结尾):

substring-before(//a[starts-with(@href,"item?")][substring(//a, string-length(//a) - string-length('comments')+1) = 'comments'],"c")

我正在使用 ScrapySharp nuget,它在下面的示例中添加,(HtmlAgilityPack 可能提供构建它的相同功能,我几年前就习惯了 ScrapySharp)

    var doc = new HtmlDocument();
    doc.Load(@"C:\desktop\anchor.html"); //I created an html file with your <a> element as the body
    var anchor = doc.DocumentNode.CssSelect("a").FirstOrDefault();
    if (anchor == null) return;

    var digits = anchor.InnerText.ToCharArray().Where(c => Char.IsDigit(c));

    Console.WriteLine($"anchor text: {anchor.InnerText} - digits only: {new string(digits.ToArray())}");

输出: