Как получить следующие 2 узла в HTML + HTMLAgilitypack

c# html-agility-pack

Вопрос

У меня есть таблица в HTML-коде ниже:

<table style="padding: 0px; border-collapse: collapse;">
    <tr>
        <td><h3>My Regional Financial Office</h3></td>
    </tr>
    <tr>
        <td>&#160;</td>
    </tr>
    <tr>
        <td><h3>My Address</h3></td>
    </tr>
    <tr>
        <td>000 Test Ave S Ste 000</td>
    </tr>
    <tr>
        <td>Golden Valley, MN 00000</td>
    </tr>
    <tr>
        <td><a href="javascript:submitForm('0000','0000000');">Get Directions</a></td>
    </tr>
    <tr>
        <td>&#160;</td>
    </tr>
</table>

Как я могу получить внутренний текст следующих тэгов 2 <tr> после вкладки, содержащей текст «Мой адрес?».

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

Вы можете использовать следующие XPath:

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
var tdOfInterests = 
        htmlDoc.DocumentNode
               .SelectNodes("//tr[td/h3[.='My Address']]/following-sibling::tr[position() <= 2]/td");
foreach (HtmlNode td in tdOfInterests)
{
    //given html input in question following code will print following 2 lines:
    //000 Test Ave S Ste 000
    //Golden Valley, MN 00000
    Console.WriteLine(td.InnerText);
}

Ключом выше XPath является использование following-sibling с фильтром position() .

ОБНОВИТЬ :

Немного объяснения XPath, использованные в этом ответе:

//tr[td/h3[.='My Address']]

над элементом выберите элемент <tr> который имеет:

  • child <td> , у которого есть дочерний элемент <h3> со значением равно 'Мой адрес'

/following-sibling::tr[position() <= 2]

следующая часть выбирает следующий элемент <tr> с позицией <= 2 от текущего элемента <tr> (тот, который выбран предыдущей частью XPath)

/td

последняя часть выбирает дочерний элемент <td> из текущего элемента <tr>



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему