Wie man Text, der kein Tag hat, mit htmlAgilityPack erhält

c# html html-agility-pack xpath

Frage

Ich habe eine HTML-Datei wie unten

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

Ich möchte einen Review-Text bekommen, der kein HTML-Tag hat. Ich verwende jetzt den folgenden Code

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

welche nur zurückkommen "Mein Ratschlag? Erhalte nicht nur eine Kopie", wie kann ich den ganzen Text bekommen?

Update: Auch wenn ich alles entferne

"br"

Tag aus htmlnode, immer noch, wenn Sie den obigen Code verwenden, bekomme ich nur "Mein Rat? Nicht nur eine Kopie" Teil !!! Jeglicher Kommentar?

Akzeptierte Antwort

Ich habe den Code folgendermaßen aktualisiert:

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

Dies sollte ein IEnumerable von Strings mit dem Text vor dem div mit dem komplizierten Stil zurückgeben.

Ohne ein bisschen mehr von dem umgebenden HTML ist es schwer zu sagen, ob dies genau das ist, wonach Sie suchen. Ich rate derzeit, dass Sie ein div ausgewählt haben und dass das div das direkte Elternteil dieses ganzen Textblocks ist (wenn Sie von einem reviewDiv sprechen). Ihr HTML-Beispiel scheint diesen Teil von HTML nicht zu enthalten, daher mache ich hier einige Annahmen.

Mit folgender Eingabe:

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

Es extrahiert das:

Wenn Sie Ron Kaufman wie ich kennen ...
Ob Sie der CEO sind ....
Geschrieben in einem unverwechselbaren, ...
Mein Rat? Erhalte nicht nur eine Kopie

Um eine einzelne Zeichenfolge zu erstellen, habe ich string extractedText = string.Join("", allText); verwendet: string extractedText = string.Join("", allText);



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum