Как получить innertext между теми же двумя тегами - PullRequest
0 голосов
/ 14 декабря 2018

Я использую 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 голосов
/ 14 декабря 2018

Прежде всего, вы должны заметить, что SelectSingleNode вернет только один узел.Точно так, как говорит название функции.Из документации возвращается:

Первый HtmlAgilityPack.HtmlNode, который соответствует запросу XPath или нулевой ссылке, если не найдено ни одного соответствующего узла.

Вы можете использовать SelectNodes вместо.Что возвращает:

Коллекция HtmlAgilityPack.HtmlNodeCollection, содержащая коллекцию узлов, соответствующих запросу HtmlAgilityPack.HtmlNode.XPath, или ноль, если ни один узел не соответствует выражению XPath.

InВ вашем случае это вернет 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());
}
...