Comment obtenir du texte qui n'a pas de balise avec htmlAgilityPack

c# html html-agility-pack xpath

Question

J'ai un fichier HTML comme ci-dessous

  <div>

  <div style="margin-left:0.5em;">
  <div class="tiny" style="margin-bottom:0.5em;">
  <b><span class="h3color tiny">This review is from: </span>You Meet</b>
  </div>
  If you know Ron Kaufman as I do ...
  <br /><br />Whether you're the CEO....
  <br /><br />Written in a distinctive, ...
  <br /><br />My advice? Don't just get one copy
  <div style="padding-top: 10px; clear: both; width: 100%;"></div>
  </div>

  <div style="margin-left:0.5em;">
  <div class="tiny" style="margin-bottom:0.5em;">
  <b><span class="h3color tiny">This review is from: </span>My Review</b>
  </div>
  I became a fan of Ron Kaufman after reading an earlier book of his years ago...
  <div style="padding-top: 10px; clear: both; width: 100%;"></div>
  </div>

  </div>

Je veux obtenir un texte de révision qui n’a pas de balise HTML. J'utilise le code ci-dessous maintenant

  foreach (HtmlNode divReview in doc.DocumentNode.SelectNodes(@"//div[@style='margin-left:0.5em;']"))   
   {
      if (divReview != null)
          {

 review.Add(divReview.Descendants("div").Where(d => d.Attributes.Contains("style") && 
 d.Attributes["style"].Value.Contains("padding-top: 10px; clear: both; width: 100%;")).
                                          Select(d =>
 d.PreviousSibling.InnerText.Trim()).SingleOrDefault());  
          }
       }

qui ne font que renvoyer "Mon conseil? N'obtenez pas qu'un exemplaire", comment puis-je obtenir le texte intégral?

Mise à jour: même si je supprime tout

"br"

balise de htmlnode, toujours quand utiliser le code ci-dessus je ne reçois que "Mon conseil? Ne recevez pas une copie" partie !!! Un commentaire?

Réponse acceptée

J'ai mis à jour le code à ceci:

var allText = (reviewDiv.Descendants("div")
  .First(div => div.Attributes["style"].Value == "padding-top: 10px; clear: both; width: 100%;")
  .SelectNodes("./preceding-sibling::text()") ?? new HtmlNodeCollection(null)) 
  .Select(text => text.InnerText);

Cela devrait renvoyer un IEnumerable de chaînes avec le texte précédant le div avec le style complexe.

Sans avoir un peu plus de HTML environnant, il est difficile de savoir si c'est exactement ce que vous recherchez. Je suppose actuellement que vous avez sélectionné une div et que cette div est le parent direct de tout ce bloc de texte (compte tenu de votre référence à reviewDiv). Votre exemple HTML ne semble pas contenir ce morceau de code HTML. Je fais donc quelques hypothèses ici.

Avec l'entrée suivante:

<div><div class="tiny" style="margin-bottom:0.5em;">
<b><span class="h3color tiny">This review is from: </span>You Meet</b>
</div>
If you know Ron Kaufman as I do ...
<br /><br />Whether you're the CEO....
<br /><br />Written in a distinctive, ...
<br /><br />My advice? Don't just get one copy
<div style="padding-top: 10px; clear: both; width: 100%;"></div></div>

Il extrait ceci:

Si vous connaissez Ron Kaufman comme moi ...
Que vous soyez le PDG ...
Écrit dans un style distinctif, ...
Mon conseil? Ne vous contentez pas d'une copie

Pour construire une seule chaîne, j’ai utilisé: string extractedText = string.Join("", allText);



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi