如何使用htmlAgilityPack获取没有标记的文本

c# html html-agility-pack xpath

我有一个像下面这样的html文件

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

我想获得没有任何html标签的评论文本。我现在使用下面的代码

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

只返回“我的建议?不要只获得一份”,我怎样才能获得全文?

更新:即使我删除所有

“BR”

从htmlnode标记,仍然使用上面的代码我只得到“我的建议?不要只得到一个副本”部分!任何意见?

一般承认的答案

我已将代码更新为:

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

这应该返回一个IEnumerable字符串,其中div前面的文本带有复杂的样式。

如果没有更多的周围HTML,很难说这是否正是你所追求的。我目前正在猜测你已经选择了一个div,并且div是整个文本块的直接父级(给出你对reviewDiv的引用)。你的HTML示例似乎不包含这段HTML,所以我在这里做了一些假设。

通过以下输入:

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

它提取了这个:

如果你像我一样认识Ron Kaufman ......
无论你是CEO ......
写得与众不同,......
我的建议?不要只获得一份副本

要构建我使用的单个字符串: string extractedText = string.Join("", allText);




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因