我正在使用HtmlAgilityPack,并且想要获取相同的两个特定标签之间的内部文本,例如:
<div class="clearfix polyxgo_rm">
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-6"></div>
<div class="col-lg-4 col-md-4 col-sm-4 col-xs-6 text-right porm" id="porm_34481"> Detail <i class="glyphicon glyphicon-menu-down"></i></div>
<div class="holder polyxgo_details" id="details_34481">
<div class="holder col-lg-12 clearfix">
<div class="">
<div class="col-lg-9 col-md-9 col-sm-8 col-xs-12" style="width:100%">
<div class="row">
<div class="col-lg-5 col-md-5 col-sm-12 col-xs-12 polyxgo_details_minimize text-center"> <span class="polyxgo_bold">max:</span> 50K</div>
<div class="col-lg-7 col-md-7 col-sm-12 col-xs-12" style="width:100%;">
<div><span class="polyxgo_bold">Exp:</span> 14/12/2018</div>
<div><span class="polyxgo_bold">Voucher:</span> 50K</div>
</div>
</div>
</div>
</div>
</div>
</div>
我尝试过,但是第一次跨度是:50K
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);
var data= document.DocumentNode.SelectSingleNode("//span[@class='polyxgo_bold']/following-sibling::text()[1]");
Console.WriteLine(data.InnerText.Trim());
我想在第Exp行:14/12/2018获得内文
我该怎么办?
答案 0 :(得分:0)
首先,您应该注意到SelectSingleNode
将只返回一个节点。确实如函数名称所说。从文档中返回:
第一个与XPath查询匹配的HtmlAgilityPack.HtmlNode,如果找不到匹配的节点,则为空引用。
您可以改用SelectNodes
。哪个返回:
一个HtmlAgilityPack.HtmlNodeCollection,其中包含与HtmlAgilityPack.HtmlNode.XPath查询匹配的节点的集合;如果没有节点与XPath表达式匹配,则为null。
在您的情况下,这将返回3个值。如果此数字始终相同,则可以简单地使用以下代码:
var document = new HtmlDocument();
document.LoadHtml(html);
HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//span[@class='polyxgo_bold']/following-sibling::text()[1]");
Console.WriteLine(nodes[1].InnerText);
将输出:14/12/2018
。
还有另一种方法。您可以使用DateTime.TryParse
来检查内部文本是否为日期,然后将其输出。像这样:
var document = new HtmlDocument();
document.LoadHtml(html);
HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//span[@class='polyxgo_bold']/following-sibling::text()[1]");
DateTime dt;
foreach (HtmlNode node in nodes)
{
if (DateTime.TryParse(node.InnerText.Trim(),out dt))
{
Console.WriteLine(node.InnerText.Trim());
}
}
另一种方法是检查该范围内的第一个文本是否为“ Exp:”,方法是:
var document = new HtmlDocument();
document.LoadHtml(html);
HtmlNodeCollection nodes = document.DocumentNode.SelectNodes("//span[@class='polyxgo_bold']/following-sibling::text()[1]");
HtmlNodeCollection nodesText = document.DocumentNode.SelectNodes("//span[@class='polyxgo_bold'][1]");
HtmlNode htmlNode = nodesText.SingleOrDefault(x => x.InnerText.Trim() == "Exp:");
if (htmlNode != null)
{
Console.WriteLine(nodes[nodesText.GetNodeIndex(htmlNode)].InnerText.Trim());
}