使用Xpath和HtmlAgilityPack查找包含特定单词或单词的innertext的所有元素

时间:2012-01-20 22:56:06

标签: xpath html-agility-pack

我正在尝试使用HtmlAgilityPack构建一个简单的搜索引擎,并使用C#(.NET 4)构建Xpath。 我想找到包含用户定义的搜索词的每个节点,但我似乎无法使XPath正确。 例如:

<HTML>
 <BODY>
  <H1>Mr T for president</H1>
   <div>We believe the new president should be</div>
   <div>the awsome Mr T</div>
   <div>
    <H2>Mr T replies:</H2>
     <p>I pity the fool who doesn't vote</p>
     <p>for Mr T</p>
   </div>
  </BODY>
</HTML>

如果指定的搜索字是“Mr T”,我想要以下节点:<H1>,第二个<div><H2>和第二个<p>。 我已经尝试了doc.DocumentNode.SelectNodes("//text()[contains(., "+ searchword +")]");的多种变体,但我似乎总是关注整个DOM中的每个节点。

任何能让我朝着正确方向前进的提示都将非常感激。

4 个答案:

答案 0 :(得分:12)

使用

//*[text()[contains(., 'Mr T')]]

这将选择XML文档中具有包含字符串'Mr T'的文本节点子项的所有元素。

这也可以缩写为

//text()[contains(., 'Mr T')]/..

这将选择包含字符串'Mr T'的任何文本节点的父节点。

答案 1 :(得分:1)

根据Xpath,如果您想查找特定关键字,您需要遵循格式(“关键字”是您要搜索的字词):

  

// * [text()[contains(。,'keyword')]]

您必须遵循与C#中相同的格式,keyword是您调用的字符串变量:

doc.DocumentNode.SelectNodes("//*[text()[contains(., '" + keyword + "')]]");

答案 2 :(得分:0)

不区分大小写的解决方案:

var xpathForFindText = &#34; // * [text()[contains(翻译(。,&#39; ABCDEFGHIJKLMNOPQRSTUVWXYZ&#39;,&#39; abcdefghijklmnopqrstuvwxyz&#39;),&#39;&#34; + lowerFocusKwd +&# 34;&#39)]]&#34 ;;

var result = doc.DocumentNode.SelectNodes(xpathForFindText);

注意:

要小心,因为lowerFocusKwd不能包含以下字符,因为xpath的格式不正确:

&#39;

答案 3 :(得分:-1)

使用以下内容:

doc.DocumentNode.SelectNodes("//*[contains(text()[1], " + searchword + ")]")

这将选择其第一个文本子(*)包含text()[1]的所有元素(searchword)。