J'ai besoin de décoder le HTML en texte brut. Je sais qu'il y a beaucoup de questions comme celle-ci mais j'ai remarqué un problème avec ces solutions et je ne sais pas comment le résoudre.
Par exemple, nous avons ce morceau de HTML:
Encore du texte Du texte
Solutions regex testées, méthode HttpUtility.HtmlDecode. Et tous donnent cette sortie: Some textSome more text . Les mots se connectent là où ils devraient être séparés. Existe-t-il un moyen de décoder une chaîne sans fusionner les mots?
4 Réponses :
Vous pouvez utiliser une regex: <(div|/div|br|p|/p)[^>edral{0,}>
Bonjour, vous voudrez peut-être lire: stackoverflow.com/a/1732454/1336590
Un moyen simple de le faire est d'utiliser le pack HTML Agility:
HtmlDocument htmlDocument= new HtmlDocument();
htmlDocument.Load(htmlString);
string res=htmlDocument.DocumentNode.SelectSingleNode("YOUR XPATH TO THE INTRESTING ELEMENT").InnerText
Cela donne le même résultat Some textSome more text tandis que le résultat attendu est Some text Some more text
@Sparrow donc vous devriez 1. choisir l'élément html qui les contient tous les deux. ou 2. choisissez chacun d'eux et concattez la chaîne. mais ce n'est pas la manière élégante de le faire.
Vous pouvez utiliser quelque chose comme suit. Dans cet exemple, j'ai utilisé une nouvelle ligne pour séparer le texte intérieur, j'espère que vous pourrez l'adapter à votre scénario.
public static string GetPlainTextFromHTML(string inputText)
{
// Extracted plain text
var plainText = string.Empty;
if(string.IsNullOrWhiteSpace(inputText))
{
return plainText;
}
var htmlNote = new HtmlDocument();
htmlNote.LoadHtml(inputText);
var nodes = htmlNote.DocumentNode.ChildNodes;
if(nodes == null)
{
return plainText;
}
StringBuilder innerString = new StringBuilder();
// Replace <p> with new lines
foreach (HtmlNode node in nodes)
{
innerString.Append(node.InnerText);
innerString.Append("\\n");
}
plainText = innerString.ToString();
return plainText;
}
On ne sait pas quel séparateur vous voulez entre des éléments qui n'étaient pas séparés en premier lieu. J'ai donc utilisé NewLine \ n .
Where (x =>! string.IsNullOrWhiteSpace (x) supprimera l'élément vide qui entraînera beaucoup de \ n \ n dans une doc HTML plus complexe
var input = "<h1><strong>Some text</strong></h1><p><br></p><p>Some more text</p>";
var htmlDocument = new HtmlDocument();
htmlDocument.LoadHtml(input);
var result = string.Join(
"\n",
htmlDocument
.DocumentNode
.ChildNodes
.Select(x=> x.InnerText)
.Where(x=>!string.IsNullOrWhiteSpace(x))
);
Résultat:
"Un peu de texte \ nUn peu plus de texte"
Vous pouvez prendre une sous-chaîne pour prendre toutes les chaînes après ">" et toutes les chaînes avant "<"
Que voudriez-vous utiliser pour séparer les deux phrases? Qu'est-ce qui déterminerait quand une phrase se termine et la suivante commence?
html-agility-pack.net vous permettra d'analyser le HTML avec assez de succès et d'accéder à toutes les parties du HTML (y compris les balises et le texte interne).
L'espace entre les mots fonctionnerait pour moi. Je veux juste m'assurer que les mots ne se mélangent pas.
Ouais ... une simple regex fera l'affaire ... ()
RegEx n'est pas une bonne réponse à cela. Bien sûr, vous constaterez peut-être que vous pouvez le faire fonctionner 99% du temps, mais HTML n'est pas XML. C'est trop irrégulier pour les expressions régulières.
En fonction de la complexité ou de la simplicité du HTML, je suppose que vous pouvez initialement remplacer tous les
par des espaces avant d'extraire le contenu en texte brut.Html agility pack oneliner
string.Join ("\ n", htmlDoc.DocumentNode.ChildNodes.Select (x => x.InnerText));chaque texte de nœud sera sur une ligne mais vous pouvez rejoindre sur un espace simple.