Come disinfettare l'html con HtmlAgilityPack?

c# html-agility-pack

Domanda

Sto affrontando un problema nel mio webscraper, essenzialmente ho bisogno di ottenere il numero decimale all'interno della cella 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>

quindi il risultato dovrebbe essere: 0.89

ma come puoi vedere l' html ha una cattiva struttura, quindi invece di ottenere 0.89 ottengo anche il contenuto di team_a_col away con questo codice:

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

Come posso ottenere solo 0,89? </td> dovrebbe essere prima di <team_a_col away ..

Risposta accettata

È necessario impostare HtmlDocument.FixNestedTags su 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 il risultato è: 0.89


Risposta popolare

Potresti prendere tutta la linea e poi la sottostringa e recuperare i dati?

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

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché