【发布时间】:2011-04-30 07:08:13
【问题描述】:
我正在尝试使用 C# 中的 HtmlAgilityPack 检索一定数量的不包含值  (空格)的元素。这是我的 XPath 表达式:
"(td)[(position() >= 10 and position() <= last()) and not(.=' ')]"
但它仍然给我这些节点,我尝试使用文字空间,&#160; ALT + 1060 - 似乎没有任何效果。这是我正在解析的内容:
<tr height=20 style='mso-height-source:userset;height:15.0pt'>
<td height=20 class=xl96 style='height:15.0pt'> </td>
<td class=xl97> </td>
<td class=xl106 style='border-top:none'>JIM COCKS</td>
<td class=xl107 style='border-top:none;border-left:none'> </td>
<td class=xl107 style='border-top:none;border-left:none'> </td>
<td class=xl107 style='border-top:none;border-left:none'>HOL</td>
<td class=xl76> </td>
<td class=xl103 style='border-left:none'> </td>
<td class=xl97> </td>
<td class=xl104 style='border-top:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'>09:30</td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'>17:00</td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl104 style='border-top:none;border-left:none'> </td>
<td class=xl76> </td>
</tr>
“xl104”类的项目是我想要抓取的(我已经在它们的类发生变化时使用位置语句完成了此操作)但我只想要包含&nbsp; 以外的其他内容的节点,例如您在上面看到的 09:30 和 17:00。
【问题讨论】:
-
哎呀。该 HTML 非常无效。如果你正在生成它,你应该清理它。如果你因为没有生成它而被它卡住了,祝你好运!
-
@Stephen - HTML Agility Pack 可以很好地处理格式错误的 HTML。这个片段看起来不错,HTML 明智。
-
我承认“HTML Agility Pack 可以很好地处理格式错误的 HTML”,因为我对此一无所知。但是,这个片段看起来不太好。缺少类属性值的引号,样式属性值的单引号,专有的“mso-height-source”Microsoft Office CSS 属性......至少该表似乎代表表格数据。
-
@Stephen - 不幸的是它是由 Excel 2007 生成的。虽然 Html Agility Pack 似乎处理得很好,但我仍然可以对属性执行 XPath 表达式。例如,我更进一步:"//tr[@height='20'][count(td)=46]")
-
@Stephen - 这些在早期的 HTML 标准中都很好。属性值不必加引号,单引号也可以,未知的CSS样式也可以。 HTML 是一个非常宽容的标准。