InnerText=InnerHtml - 如何使用 HtmlAgilityPack 提取可读文本

InnerText=InnerHtml - How to extract readable text with HtmlAgilityPack

我需要从一个非常糟糕的 Html.

中提取文本

我正在尝试使用 vb.netHtmlAgilityPack

来做到这一点

我需要解析的标签有 InnerText = InnerHtml 和两者:

Name:<!--b>&#61;</b--> Albert E<!--span-->instein  s<!--i>&#89;</i-->ection: 3 room: -

调试时我可以使用 "Html viewer" 读取它:它显示:

Name: Albert Einstein section: 3 room: -

如何将其放入字符串变量中?

编辑:

我使用这段代码获取节点:

Dim ElePs As HtmlNodeCollection = _
    mWPage.DocumentNode.SelectNodes("//div[@id='div_main']//p")
For Each EleP As HtmlNode In ElePs
    'Here I need to get EleP.InnerText "normalized"
Next

如果你注意到这个乱七八糟的东西实际上只是 html 评论,它们将被忽略,所以只需获取文本并使用 string.Join 就足够了:

C#

var text = string.Join("",htmlDoc.DocumentNode.SelectNodes("//text()[normalize-space()]").
                                            Select(t=>t.InnerText));

VB.net

 Dim text = String.Join("", From t In htmlDoc.DocumentNode.SelectNodes("//text()[normalize-space()]")
                                   Select t.InnerText)

html有效,没什么不好的,就是没灵魂的人写的

根据您的更新,应该这样做:

Dim ElePs As HtmlNodeCollection = mWPage.DocumentNode.SelectNodes("//div[@id='div_main']//p")
For Each EleP As HtmlNode In ElePs
    'Here I need to get EleP.InnerText "normalized"
     Dim text = String.Join("", From t In EleP.SelectNodes(".//text()[normalize-space()]")
                Select t.InnerText).Trim()
Next

注意 .// 这意味着它将查找当前节点的后代节点,这与 // 不同,后者总是从顶部节点开始。