HtmlAgilityPack根据单元格值获取表

时间:2015-04-26 00:52:02

标签: powershell xpath html-agility-pack

我有1000多个HTML文档,每个文档都包含各种表格,并使用PowerShell来处理它们。

我希望提取特定的表格,这些表格可以通过第一行标识,第一行用于标题,其中一个单元格总是包含单词" measurement"。

由于HTML是.doc导出,因此单词可以嵌套在<span><p>中,因此理想情况下我可以忽略该嵌套级别。

我尝试过类似的事情:

$tables = $doc.DocumentNode.SelectNodes("//table[* = 'measurement']")

但什么都没有回来。

这里还有一些HTML,遗憾的是我无法发布所有内容,但它将MS Word导出为HTML文档:

<table class=MsoNormalTable border=1 cellspacing=0 cellpadding=0
   style='border-collapse:collapse;mso-table-layout-alt:fixed;border:none;
   mso-border-alt:double windowtext 1.5pt;mso-padding-alt:0in 5.4pt 0in 5.4pt'>
<tr style='mso-yfti-irow:0;mso-yfti-firstrow:yes'>
   <td width=192 valign=top style='width:2.0in;border:solid windowtext 1.0pt;
      padding:0in 5.4pt 0in 5.4pt'>
      <p class=MsoHeading9><span lang=EN-CA>Areas</span></p>
   </td>
   <td width=288 valign=top style='width:3.0in;border:solid windowtext 1.0pt;
      border-left:none;mso-border-left-alt:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt'>
      <p class=MsoHeading9><span lang=EN-CA>measurements</span></p>
   </td>
   <td width=346 valign=top style='width:3.6in;border:solid windowtext 1.0pt;
      border-left:none;mso-border-left-alt:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt'>
      <p class=MsoHeading9><span lang=EN-CA>Objectives</span></p>
   </td>
</tr>

1 个答案:

答案 0 :(得分:2)

如果没有进一步的信息或示例HTML标记,我只能建议使用后代轴//来获取所有后代节点,无论它们嵌套在<table>节点内有多深:

//table[.//* = 'measurement']

更新:

在查看示例HTML之后,我认为通过使用更具体的xpath可能会有更有效的方法,例如:

//table[tr/td//* = 'measurement']

但是特定的xpath也会带来更多冒一些应该被选中的表的风险。根据整个文档结构以及需要多少效率,决定权归你所有。