HTML Agility Pack - захватить текст после узла

c# html html-agility-pack

Вопрос

У меня есть HTML, который я обрабатываю с помощью C #

Пример текста ниже, хотя это повторяется примерно 150 раз с разными записями

<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>

Я пытаюсь получить текст в массиве, который будет похож на

customerArray [0,0] = Title
customerArray [0,1] = Mr
customerArray [1,0] = First Name
customerArray [1,1] = Fake
customerArray [2,0] = Surname
customerArray [2,1] = Guy

Я могу получить текст в массиве, но мне просто не удается получить текст после закрытия строки STRONG до тех пор, пока тег BR не найдет следующий тег STRONG

любая помощь будет оценена

Принятый ответ

Вы можете использовать XPath next following-sibling::text()[1] чтобы получить текстовый узел, расположенный сразу после каждого strong . Вот минимальный, но полный пример:

var raw = @"<div>
<strong>Title</strong>: Mr<br>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>
        </div>";
var doc = new HtmlDocument();
doc.LoadHtml(raw);
foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//strong"))
{
    var val = node.SelectSingleNode("following-sibling::text()[1]");
    Console.WriteLine(node.InnerText + ", " + val.InnerText);
}

dotnetfiddle demo

вывод :

Title, : Mr
First name, : Fake
Surname, : Guy

Вы должны иметь возможность удалить «:», выполнив простые манипуляции с строкой, если это необходимо ...


Популярные ответы

<strong> - общий тег, поэтому что-то конкретное для предоставленного вами формата.

var html = @"
<div>
<strong>First name</strong><em>italic</em>: Fake<br>
<strong>Bold</strong> <a href='#'>hyperlink</a><br>.
<strong>bold</strong>
<strong>bold</strong> <br>
text
</div>

<div>
<strong>Title</strong>: Mr<BR>
<strong>First name</strong>: Fake<br>
<strong>Surname</strong>: Guy<br>
</div>";

var document = new HtmlDocument();
document.LoadHtml(html);
// 1. <strong>
var strong = document.DocumentNode.SelectNodes("//strong");
if (strong != null)
{
    foreach (var node in strong.Where(
        // 2. followed by non-empty text node
        x => x.NextSibling is HtmlTextNode
        && !string.IsNullOrEmpty(x.NextSibling.InnerText.Trim())
        // 3. followed by <br>
        && x.NextSibling.NextSibling is HtmlNode
        && x.NextSibling.NextSibling.Name.ToLower() == "br"))
    {
        Console.WriteLine("{0} {1}", node.InnerText, node.NextSibling.InnerText);
    }
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow