HTTP Agility Pack - Acessando irmãos?
-
26-09-2019 - |
Pergunta
Usar o pacote de agilidade HTML é ótimo para obter descendentes e mesas inteiras etc ... mas como você pode usá -lo na situação abaixo
...Html Code above...
<dl>
<dt>Location:</dt>
<dd>City, London</dd>
<dt style="padding-bottom:10px;">Distance:</dt>
<dd style="padding-bottom:10px;">0 miles</dd>
<dt>Date Issued:</dt>
<dd>26/10/2010</dd>
<dt>type:</dt>
<dd>cement</dd>
</dl>
...HTML Code below....
Como você conseguiu encontrar se Miles era menor que 15 neste caso, eu me destaquei, você poderia fazer algo com elementos, mas você precisaria obter todos os elementos encontrarem o correto e depois encontrar o número apenas para verificar seu valor? Ou há como usar o Regex com o Agility Pack para conseguir isso de uma maneira melhor ...
Solução
Tenho certeza (não verifiquei) que ele suporta o following-sibling::
eixo, então você poderia qualquer Encontre o nó "dt[.='Distance:']"
e então encontre node.SelectSingleNode("following-sibling::dd[1]")
- ou (mais simples) basta usar node.NextSibling
Se você tem certeza de que o dd
sempre segue imediatamente o dt
.
Por exemplo:
string distance = doc.DocumentNode.SelectSingleNode(
"//dt[.='Distance:']/following-sibling::dd").InnerText;
Outras dicas
Get just html simblings
public static List<HtmlNode> GetHtmlNodeList(string html)
{
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var regs = doc.DocumentNode.SelectSingleNode("//div");
var first = regs.Descendants().FirstOrDefault();
var second = first.NextSibling;
List<HtmlNode> list = new List<HtmlNode>();
while (second != null)
{
list.Add(second);
second = CheckSibling(second);
}
return list;
}
private static HtmlNode CheckSibling(HtmlNode node)
{
node = node.NextSibling;
return node;
}