Traverse DOM с пакетом гибкости HTML

.net asp.net c# html html-agility-pack

Вопрос

Я разбираю HTML DOM в C # с библиотекой HTMLAgilityPack и хотел бы знать, как пересечь DOM, как только я доберусь до определенного элемента.

Например, когда я добираюсь до td с классом «some-class», я хочу перейти к третьему sibling td и захватить href его вложенного anchor .

<td class="some-class">Content I care about</td>
<td>Content I don't want</td>
<td>Content I don't want</td>
<td>    
    <a href="http://www.the-url-I-want.com">Some Amazing URL</a>
</td>

В настоящее время я сажусь на td я хочу через:

foreach(HtmlNode node in doc.DocumentNode.SelectNodes("//td"))
{
    HtmlAttribute nodeClass = node.Attributes["class"];

    if(nodeClass != null && nodeClass.Value == "some-class")
    {
        //Find the anchor that is 3 siblings away
        //Do something
    }
}

Кто-нибудь знает, как я буду использовать пакет HTMLAgility для захвата связанного якоря для отдельного td ?

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

Изучите XPath, и ваша работа может быть намного проще. Например, чтобы получить элемент <td> имеющий атрибут класса равно «some-class», мы можем использовать этот Xpath:

//td[@class='some-class']

И для получения третьего следующего брата <td> :

/following-sibling::td[3]

Таким образом, ваша петля может быть переписана следующим образом:

var xpath = "//td[@class='some-class']/following-sibling::td[3]/a";
foreach(HtmlNode a in doc.DocumentNode.SelectNodes(xpath))
{
    //Do something with the anchor variable a
}

BTW, более безопасный способ получения значения атрибута использует GetAttributeValue() :

var href = a.GetAttributeValue("href", "");

второй аргумент - значение по умолчанию, которое будет возвращено, если атрибут не найден.



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