¿Cómo desinfectar html con HtmlAgilityPack?

c# html-agility-pack

Pregunta

Estoy enfrentando un problema en mi webscraper, básicamente necesito obtener el número decimal dentro de la celda team_a_col home :

<th>Med. goal subiti p/p</th>
<td class='team_a_col total'>0.76</td>
<td class='team_a_col home'>0.89
<td class='team_a_col away'>0.62</td></td>

por lo que el resultado debe ser: 0.89

pero como puedes ver, el html tiene una mala estructura, así que en lugar de obtener 0.89 también obtengo el contenido de team_a_col away con este código:

node.SelectSingleNode(".//td[@class='team_a_col home']").InnerText.Trim();

¿Cómo puedo obtener solo 0,89? El </td> debe estar antes de <team_a_col away ..

Respuesta aceptada

Debes establecer HtmlDocument.FixNestedTags en true :

string html = "<th>Med. goal subiti p/p</th><td class='team_a_col total'>0.76</td><td class='team_a_col home'>0.89<td class='team_a_col away'>0.62</td></td>";

var doc = new HtmlAgilityPack.HtmlDocument
{
    OptionFixNestedTags = true,
    OptionCheckSyntax = true,
    OptionAutoCloseOnEnd = true
};
doc.LoadHtml(html);

string tdText = doc.DocumentNode.SelectSingleNode(".//td[@class='team_a_col home']")?.InnerText.Trim();

Con FixNestedTags el resultado es: 0.89


Respuesta popular

¿Podría simplemente tomar toda la línea y luego crear una subcadena y recuperar los datos?

var node = doc.DocumentNode.SelectNodes("//htmlelment/htmlelment");

string[] nodeArray = node[0].OuterHtml.Split(' ');


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow