Win*_*der 4 .net c# xpath xml-parsing html-agility-pack
好的,我对HTMLAgilityPack中使用的XPath查询真的很陌生.
所以让我们考虑这个页面http://health.yahoo.net/articles/healthcare/what-your-favorite-flavor-says-about-you.我想要的是只提取页面内容而不是其他内容.
所以我首先删除脚本和样式标签.
Document = new HtmlDocument();
Document.LoadHtml(page);
TempString = new StringBuilder();
foreach (HtmlNode style in Document.DocumentNode.Descendants("style").ToArray())
{
style.Remove();
}
foreach (HtmlNode script in Document.DocumentNode.Descendants("script").ToArray())
{
script.Remove();
}
Run Code Online (Sandbox Code Playgroud)
之后,我尝试使用// text()来获取所有文本节点.
foreach (HtmlTextNode node in Document.DocumentNode.SelectNodes("//text()"))
{
TempString.AppendLine(node.InnerText);
}
Run Code Online (Sandbox Code Playgroud)
然而,不仅我不仅仅是文本,我也得到了无数/ r/n字符.
请在这方面我需要一些指导.
pau*_*rth 13
如果您认为script并且style节点只有子节点的文本节点,则可以使用此XPath表达式来获取不在其中的文本节点script或style标记,这样您就不需要事先删除节点:
//*[not(self::script or self::style)]/text()
Run Code Online (Sandbox Code Playgroud)
您可以使用XPath进一步排除仅为空格的文本节点normalize-space():
//*[not(self::script or self::style)]/text()[not(normalize-space(.)="")]
Run Code Online (Sandbox Code Playgroud)
或者更短
//*[not(self::script or self::style)]/text()[normalize-space()]
Run Code Online (Sandbox Code Playgroud)
但是您仍然会获得可能具有前导或尾随空格的文本节点.这可以在您的应用程序中处理,如@ aL3891所示.
如果\r \n最终字符串中的字符有问题,您可以在事后删除它们:
TempString.ToString().Replace("\r", "").Replace("\n", "");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3206 次 |
| 最近记录: |