如何获取在 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 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())}");
输出:
我正在尝试获取此标签的文本值:
<a href="item?id=22513425">67 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())}");
输出: