InnerText=InnerHtml - 如何使用 HtmlAgilityPack 提取可读文本
Posted
技术标签:
【中文标题】InnerText=InnerHtml - 如何使用 HtmlAgilityPack 提取可读文本【英文标题】:InnerText=InnerHtml - How to extract readable text with HtmlAgilityPack 【发布时间】:2016-06-15 03:08:03 【问题描述】:我需要从一个非常糟糕的 html 中提取文本。
我正在尝试使用 vb.net
和 HtmlAgilityPack
来做到这一点
我需要解析的标签有 InnerText = InnerHtml 和两者:
Name:<!--b>=</b--> Albert E<!--span-->instein s<!--i>Y</i-->ection: 3 room: -
在调试时,我可以使用“Html 查看器”阅读它:它显示:
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
【问题讨论】:
你可以试试这个吗? ***.com/questions/3442394/… 我不知道这是否适用于糟糕的 html...尝试 你需要发布更多我认为的 html - 从表面上看并没有那么糟糕 @Mr.Developer 你能再解释一下吗?我理解逻辑,但我需要更多的帮助来尝试它。提前致谢 我在 stavkover 上尝试了另一个问题...尝试解决方案..如果也可以在错误的 html 上工作 这会删除所有标签...还有坏标签...试试***.com/questions/8692423/… 【参考方案1】:如果你注意到这个混乱实际上只是 html cmets,它们应该被忽略,所以只需获取文本并使用 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
注意.//
,这意味着它将寻找当前节点的后代节点,而//
总是从顶部节点开始。
【讨论】:
感谢您的回答,但我无法使其适应我的代码。我更新了我的问题以显示如何获得提取 InnerText 所需的 Html 元素。您能否根据我的代码调整您的答案?以上是关于InnerText=InnerHtml - 如何使用 HtmlAgilityPack 提取可读文本的主要内容,如果未能解决你的问题,请参考以下文章
Javascript中的innerText和InnerHTML
JS中innerHTML 和innerText和value的区别