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

时间:2016-03-02 10:16:31

标签: html vb.net html-agility-pack innerhtml innertext

我需要从一个非常糟糕的Html中提取文本。

我尝试使用vb.netHtmlAgilityPack

执行此操作

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

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

在调试时,我可以使用&#34; Html viewer&#34;来阅读它:它显示:

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

1 个答案:

答案 0 :(得分:2)

如果您注意到这个混乱实际上只是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

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