HtmlAgilityPack 根据单元格值获取表格
HtmlAgilityPack get tables based on cell value
我有 1000 多个 HTML 个文档,每个文档都包含各种表格,并且正在使用 PowerShell 来处理它们。
我想提取特定的表格,这些可以通过第一行识别,用于标题,其中一个单元格总是有单词 "measurement"。
由于 HTML 是 .doc 导出词可以嵌套在 <span>
或 <p>
中,所以理想情况下我可以忽略该嵌套级别。
我试过类似的方法:
$tables = $doc.DocumentNode.SelectNodes("//table[* = 'measurement']")
但一无所获。
还有一些 HTML,不幸的是我不能 post 全部,但它是 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 标记,我只能建议使用后代轴 //
来获取所有后代节点,无论它们嵌套在 <table>
节点中有多深:
//table[.//* = 'measurement']
更新:
查看示例 HTML 后,我认为使用更具体的 xpath 可能会有更有效的方法,例如:
//table[tr/td//* = 'measurement']
但特定的 xpath 也带来了更多的风险,会留下一些应该被选中的表。根据整个文档结构和需要多少效率,由您决定。
我有 1000 多个 HTML 个文档,每个文档都包含各种表格,并且正在使用 PowerShell 来处理它们。
我想提取特定的表格,这些可以通过第一行识别,用于标题,其中一个单元格总是有单词 "measurement"。
由于 HTML 是 .doc 导出词可以嵌套在 <span>
或 <p>
中,所以理想情况下我可以忽略该嵌套级别。
我试过类似的方法:
$tables = $doc.DocumentNode.SelectNodes("//table[* = 'measurement']")
但一无所获。
还有一些 HTML,不幸的是我不能 post 全部,但它是 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 标记,我只能建议使用后代轴 //
来获取所有后代节点,无论它们嵌套在 <table>
节点中有多深:
//table[.//* = 'measurement']
更新:
查看示例 HTML 后,我认为使用更具体的 xpath 可能会有更有效的方法,例如:
//table[tr/td//* = 'measurement']
但特定的 xpath 也带来了更多的风险,会留下一些应该被选中的表。根据整个文档结构和需要多少效率,由您决定。