2
votes

Comment décoder du HTML en chaîne?

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:

Du texte


Encore 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?


8 commentaires

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.


4 Réponses :


-1
votes

Vous pouvez utiliser une regex: <(div|/div|br|p|/p)[^>edral{0,}>


1 commentaires

Bonjour, vous voudrez peut-être lire: stackoverflow.com/a/1732454/1336590



2
votes

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


2 commentaires

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.



0
votes

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;
    }


0 commentaires

4
votes

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"


0 commentaires