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