Come posso estrarre solo il testo dall'html

c# html-agility-pack

Domanda

Ho il requisito di estrarre tutto il testo che è presente nel <body> dell'html. Esempio di input HTML: -

<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src="abc.jpg"/>
    </body>
</html>

L'output dovrebbe essere: -

<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src="abc.jpg"/>
    </body>
</html>

Voglio usare solo HtmlAgility per questo scopo. Nessuna espressione regolare per favore.

So come caricare HtmlDocument e quindi usando xquery come '// body' possiamo ottenere il contenuto del corpo. Ma come faccio a togliere l'html come mostrato nell'output?

Grazie in anticipo :)

Risposta accettata

Puoi usare il InnerText del corpo:

string html = @"
<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src=""abc.jpg""/>
    </body>
</html>";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.SelectSingleNode("//body").InnerText;

Successivamente, potresti voler comprimere spazi e nuove linee:

string html = @"
<html>
    <title>title</title>
    <body>
           <h1> This is a big title.</h1>
           How are doing you?
           <h3> I am fine </h3>
           <img src=""abc.jpg""/>
    </body>
</html>";

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
string text = doc.DocumentNode.SelectSingleNode("//body").InnerText;

Nota, tuttavia, che mentre funziona in questo caso, markup come hello<br>world o hello<i>world</i> sarà convertito da InnerText a helloworld - rimuovendo i tag. È difficile risolvere questo problema, poiché la visualizzazione è determinata dal CSS, non solo dal markup.


Risposta popolare

Che ne dici di usare l'espressione XPath '//body//text()' per selezionare tutti i nodi di testo?




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é