如何在相同的两个标签之间获取内部文本

时间:2018-12-14 08:02:04

标签: .net vb.net html-agility-pack

我正在使用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获得内文

我该怎么办?

1 个答案:

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