我需要从一个非常糟糕的Html中提取文本。
我尝试使用vb.net
和HtmlAgilityPack
我需要解析的标签有InnerText = InnerHtml和两者:
Name:<!--b>=</b--> Albert E<!--span-->instein s<!--i>Y</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
答案 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
注意.//
这意味着它将查找当前节点的后代节点,而//
总是从顶层节点开始。