IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Récupérer les retours à la ligne d'un paragraphe de page web


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut Récupérer les retours à la ligne d'un paragraphe de page web
    Bonjour,

    Je récupère le texte d'une page web afin de remplir des champs dans mon appli.
    Je le fais par dragdrop d'un article (wordpress) dans une zone de mon interface.

    Il y a un champ "description" qui comporte des retours à la ligne dans le texte de l'article du site.
    Ces retours à la ligne disparaissent dans le texte que je récupère (paralist[3] dans mon code ci-dessous).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            private bool Extraction_INFOS_URL(string url)
            {
    [...]
                    List<string> Paralist = new List<string>();
     
                    var div = doc.DocumentNode.Descendants("p");
                    foreach (var Para in div)
                    {
                        Paralist.Add(Para.InnerText); // Je charge une liste avec les paragraphes de la page web
                }
     
                    DescriptionRichTxt.Text = System.Net.WebUtility.HtmlDecode(Paralist[3] + "\n"); // PERTE DES RETOURS A LA LIGNE
     
    [...]
    Comment conserver ces retours à la ligne ?

    Merci pour votre aide !

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Je ne comprends pas la logique derrière ce code.

    Paralist contient une liste de paragraphes.
    Tu as donc une liste qui contient déjà tes paragraphes de manière séparée
    En plus tu ne vas lire que le 4ème.

  3. #3
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Bonjour Popo,

    Ce n'est qu'une toute petite partie de ma méthode que j'ai postée.
    La partie qui me pose problème.

    Je récupère tous les paragraphes du site. Ce n'est pas cela le souci.
    Celui qui contient la description possède sur le site web de nombreux retours à la ligne, qui sont perdus lorsque je l'affiche dans une richtextebox de mon appli.

    Voici ce que je suis censé récupérer :
    paralist[3]
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <p>Habillage de cheminée Art Déco en fer et laiton. <br>Cœur avec portes ouvragées en laiton. <br>Linteau et jambages ornés de motifs géométriques. <br>Dimensions du cœur : 58 x 48 cm. <br>Origine Pays-Bas, fabricant « <strong>F.M. BEENS</strong>« , Roosendaal.<br>Circa 1900. </p>
    paralist[4]
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <p>Hauteur : 90 cm – Largeur : 95 cm – Profondeur : 9 cm – Poids : 14 kg</p>

    C'est paralist[3] mon problème.
    Il s'affiche sur une seule ligne dans mon appli.
    Les <br> ne sont pas interprétés.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 123
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 123
    Points : 1 630
    Points
    1 630
    Par défaut
    Il faut "forcer" le remplacement des <br> par des retours à la ligne (Replace)

  5. #5
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Bonjour Umfred,

    Je comprends, créer une moulinette pour remplacer les <br> par system.environnement.newline.
    Ou plutôt les "." suivis d'un espace par newline et espace, car les <br> sont absents de la chaîne reçue.

    C'est ce que j'avais commencé à faire, avant de me demander s'il n'y avait pas un truc moins pénible à faire.

    Cas d'école, car "F. M. Beens" avec initiales des prénoms dans ma chaîne renverra deux retours à la ligne. Pffffff !

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Dans la mesure où tu utilise une routine qui n'est pas faite pour ça, ce résultat est normal.

    Je n'ai pas fait le rapprochement avec BR pour la même raison.

    Edit:
    Tu as d'ailleurs pu constater que cela avait gardé la balise P également.

    HtmlDecode n'est pas fait pour traduire du Html en texte. Cette routine sert à décoder du HTML qui a été codé pour apparaître comme tel. Par exemple elle sert à décoder $lt; en <. L'inverse de HtmlEncode quoi. Sinon < serait interprété comme le début d'une balise et non comme un caractère dans le texte.

    Si tu veux traduire du html il faut utiliser un outil approprié. Je crois avoir vu passer un nuget nommé Html Agility Pack qui pourrait potentiellement t'intéresser.

  7. #7
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    Janvier 2015
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : Janvier 2015
    Messages : 142
    Points : 108
    Points
    108
    Par défaut
    Merci Popo,
    Vous m'avez mis sur la piste.

    En fait, j'utilise déjà Html Agility Pack, mais à un moment je l'utilise mal.
    J'ai relu la doc du nuget.
    J'ai remplacé InnerText par InnerHtml qui conserve les caractères html.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                    List<string> Paralist = new List<string>();
     
                    var div = doc.DocumentNode.Descendants("p");
                    foreach (var Para in div)
                    {
                        //Paralist.Add(Para.InnerText); // <<<<<<< J'utilisais InnerText 
                        Paralist.Add(Para.InnerHtml); // <<<<<<< au lieu de InnerHtml (qui conserve dans la chaîne les caractères html)
     
                }
    Ensuite je remplace les <br> par newline

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DescriptionRichTxt.Text = Paralist[3].Replace("<br>", Environment.NewLine);
    puis je supprime les <strong> éventuels qui pourraient traîner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                    var boldRegex = new Regex(@"</?(\s|\t|\n)*strong((\s|\t|\n).*?)*?>|</?(\s|\t|\n)*b((\s|\t|\n).*?)*?>|font-weight(\s|\t|\n)*:(\s|\t|\n)*?bold");
                    DescriptionRichTxt.Text = boldRegex.Replace(DescriptionRichTxt.Text, "");
    J'obtiens mon résultat.
    Sujet résolu

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/09/2015, 14h54
  2. récupérer les retours à la ligne d'un textarea
    Par epeichette dans le forum jQuery
    Réponses: 4
    Dernier message: 08/04/2011, 12h13
  3. Réponses: 11
    Dernier message: 09/02/2011, 03h15
  4. Réponses: 10
    Dernier message: 25/03/2009, 23h29
  5. Conserver les retours à la ligne
    Par arwen dans le forum ASP
    Réponses: 2
    Dernier message: 04/12/2003, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo