【问题标题】:HtmlAgilityPack get tables based on cell valueHtmlAgilityPack 根据单元格值获取表格
【发布时间】:2015-04-26 00:52:02
【问题描述】:

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

我希望提取特定的表格,这些可以通过第一行来识别,第一行用于标题,其中一个单元格始终包含“测量”一词。

由于 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>

【问题讨论】:

  • 发布最小的 HTML 示例,展示您的代码如何失败
  • 仅供参考,格式化您的代码:阻止/选择代码,然后单击编辑器顶部的{} 按钮

标签: powershell xpath html-agility-pack


【解决方案1】:

如果没有更多信息或示例 HTML 标记,我只能建议使用后代轴 // 来获取所有后代节点,无论它们嵌套在 &lt;table&gt; 节点中的深度:

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

更新:

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

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

但特定的 xpath 也会带来更多风险,即留下一些应该被选中的表。根据整个文档结构以及需要多少效率,您可以做出决定。

【讨论】:

  • 我想你明白了,让我测试一下,但是得到结果并且数字看起来是正确的。
  • @Radek 不客气 :) 也考虑 UPDATE 部分,但可能会也可能不会满足您的需求