带有XPath的HtmlAgilityPack - 检索不包含的节点

时间:2010-10-25 15:42:11

标签: c# html xpath

我正在尝试使用C#中的HtmlAgilityPack检索包含值 (空格)的一定数量的元素。这是我的XPath表达式:

"(td)[(position() >= 10 and position() <= last()) and not(.='&nbsp;')]"

但它仍然给我这些节点,我尝试使用文字空间,&#160; ALT + 1060 - 似乎没有任何效果。这是我正在解析的内容:

 <tr height=20 style='mso-height-source:userset;height:15.0pt'>
  <td height=20 class=xl96 style='height:15.0pt'>&nbsp;</td>
  <td class=xl97>&nbsp;</td>
  <td class=xl106 style='border-top:none'>JIM COCKS</td>
  <td class=xl107 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl107 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl107 style='border-top:none;border-left:none'>HOL</td>
  <td class=xl76>&nbsp;</td>
  <td class=xl103 style='border-left:none'>&nbsp;</td>
  <td class=xl97>&nbsp;</td>
  <td class=xl104 style='border-top:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>09:30</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td> 
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>17:00</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl104 style='border-top:none;border-left:none'>&nbsp;</td>
  <td class=xl76>&nbsp;</td>
 </tr>

具有类'xl104'的项目是我想要抓取的(我已经使用位置语句完成了它们的类更改)但我只想要包含除&nbsp;以外的其他内容的节点,例如你看到上面的09:30和17:00。

2 个答案:

答案 0 :(得分:1)

"(td)[(position() >= 10 and position() <= last()) and not(.='&nbsp;')]" 

not(.='&nbsp;')

测试整个text()节点不是字符串'&nbsp;'

您想使用XPath contains()函数

not(contains(., '&#xA0;'))

答案 1 :(得分:0)

  

我正在尝试检索选择金额   不包含的元素   值&nbsp;

我相信@Dimitre已经回答了该任务的规范。

  

我只想要包含的节点   除&nbsp;

之外的其他内容

略有不同的规格。 这有用吗? (已编辑;感谢亚历杭德罗。)

"td[position() >= 10 and translate(., '&#xA0;', '') != '']" 

这相当于更短,但可读性更低:

"td[position() >= 10 and translate(., '&#xA0;', '')]" 

无论如何,你发现了这个问题,所以我们不会再这么做了。

请注意,除非您定义,否则在XPath中逐字使用&nbsp;通常不会起作用。此字符实体以HTML格式预定义,但不以XML格式预定义。这就是&#160;&#xA0;更可靠的原因。但是,HtmlAgilityPack可能会为您定义。