HtmlAgilityPack,使用 XPath 包含方法和谓词

Posted

技术标签:

【中文标题】HtmlAgilityPack,使用 XPath 包含方法和谓词【英文标题】:HtmlAgilityPack, using XPath contains method and predicates 【发布时间】:2013-01-19 13:37:30 【问题描述】:

htmlAgilityPack,使用 XPath 包含方法

我正在使用 HtmlAgilityPack,我需要知道一个类属性是否包含特定的单词,现在我有了这个页面:

<div class="yom-mod yom-art-content "><div class="bd">
<p class="first"> ....................
  </p>
</div>
</div>

我正在这样做:

HtmlDocument doc2 = ...;
List<string> paragraphs = doc2.DocumentNode.SelectNodes("//div[@class = 'yom-mod yom-art-content ']//p").Select(paragraphNode => paragraphNode.InnerHtml).ToList();

但是太具体了,我需要的是这样的:

List<string> paragraphs = doc2.DocumentNode.SelectNodes("//div[contains(@class, 'yom-art-content']//p").Select(paragraphNode => paragraphNode.InnerHtml).ToList();

但它不起作用,请帮助我..

【问题讨论】:

【参考方案1】:

不要为此使用 HAP,而是查看提供 jQuery 样式选择器的 CsQuery。

它看起来特别适合你想要做的事情。

CsQuery 是 .NET 4 的 jQuery 端口。它实现了所有 CSS2 和 CSS3 选择器、jQuery 的所有 DOM 操作方法以及一些实用方法。大部分 jQuery 测试套件(从 1.6.2 开始)已移植到 C#。

【讨论】:

【参考方案2】:

也许问题只是你缺少 contains() 函数的右括号:

//div[contains(@class, 'yom-art-content']//p
                                        v
//div[contains(@class, 'yom-art-content')]//p


List<string> paragraphs = 
        doc2.DocumentNode.SelectNodes("//div[contains(@class, 'yom-art-content')]//p")
            .Select(paragraphNode => paragraphNode.InnerHtml).ToList();

作为一般建议,请解释您说“它不起作用”之类的意思。我怀疑您收到了可能有助于追查问题的错误消息?

【讨论】:

以上是关于HtmlAgilityPack,使用 XPath 包含方法和谓词的主要内容,如果未能解决你的问题,请参考以下文章

HtmlAgilityPack XPath 错误

C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

XPath/HtmlAgilityPack:如何查找具有属性 (href) 特定值的元素 (a) 并查找相邻的表列?

Android C# HtmlAgilityPack

求C# HtmlAgilityPack用法的完整例子。

如何使用 C# 转义 XPath 引号“”