Я разбираю HTML DOM в C# с библиотекой HTMLAgilityPack
и хотел бы знать, как пересечь DOM, как только я попаду к определенному элементу.Traverse DOM с пакетом гибкости HTML
Например, когда я добираюсь до td
с классом «некоторым класс», я хочу, чтобы перейти к третьему собрату 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
?
До сих пор это работает (но чувствует себя смехотворно неуклюжее) ... 'HtmlNode siblingAnchor = node.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.FirstChild.NextSibling;' –
Это на самом деле является разумным кодом для получения определенного узла-брата (если вы можете терпеть случайное «NullRefferenceException», если HTML изменяется). Я бы рекомендовал прочитать некоторые базовые учебники по XPath, чтобы иметь возможность более точно/быстрее выбирать элементы (т. Е. '' // "' искать все дерево для соответствия, и часто вы можете сузить поиск по крайней мере до определенного поддерева, вы также можете сопоставлять атрибуты напрямую с XPath). –
@AlexeiLevenkov HTML должен быть статичным, и если он изменится, я смогу проверить на выходе программы. Я буду копаться в учебниках по XPath, чтобы посмотреть, как оптимизировать. Еще раз спасибо за ссылку на HTMLAgilityPack, btw :) –