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

html html-agility-pack innerhtml innertext vb.net

我需要从非常糟糕的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

注意.//这意味着它将查找当前节点的后代节点,这与//始终从顶层节点开始。



Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow