来自 HTML 的二维数组
2D Array from HTML
我的任务是将 HTML table 转换为二维数组,以便我可以将内容写入 CSV 文件。我对创建第二个数组维度的最佳方法很着迷。这是我目前所拥有的(带有示例数据):
$data = '<table style="width:100%"> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr> </table> '
$data = [regex]::matches($data, '<table.*?>(.+)</table>')
$data = $data[0].Groups[1].value
$arr = @()
$arr = [regex]::matches($data, '<tr.*?>(.*?)</tr>') | % {$_.Groups[1].value}
我现在有一个 <tr>
行数组(减去 <tr>
标签)。有没有办法接下来拆分 <td>
元素并从中创建一个数组数组?我可能会用蛮力解决这个问题,但我觉得有一种更简洁、可能更优化的方法。
顺便说一下,我使用的是 PowerShell v2。
如果你仔细看看到目前为止你有什么,你会注意到一个模式:你拿一个带有 HTML 片段的字符串,将它与正则表达式 <tag.*?>(.*?)</tag>
匹配,然后从匹配中提取捕获的组(括号之间的部分)。您对 <table>
标签和 <tr>
标签都这样做。使用相同的方法为每一行提取 <td>
标记的内容。
$arr | ForEach-Object {
[regex]::matches($_, '<td.*?>(.*?)</td>') | ForEach-Object {
$_.Groups[1].Value
}
}
[regex]::matches() | ForEach-Object {}
语句为每行提供 list/array 个 <td>
值。如果您通过在它们前面加上一元逗号运算符将这些列表附加到一个空数组,例如
$td = @()
$arr | ForEach-Object {
$td += ,@([regex]::matches($_, '<td.*?>(.*?)</td>') | ForEach-Object {
$_.Groups[1].Value
})
}
您将数组作为一个整体附加,而不是附加每个单独的元素,结果如下:
[ [ 'Jill', 'Smith', 50 ], [ 'Eve', 'Jackson', 94 ] ]
而不是平面数组:
[ 'Jill', 'Smith', 50, 'Eve', 'Jackson', 94 ]
结果不完全是一个二维数组(它实际上是一个数组数组,而二维数组将是一个二维数组)。不过,这就是您通常在 PowerShell 中处理此类事情的方式。
为了更好地了解您在这里究竟在做什么,您可能需要阅读 operators, arrays, and regular expressions。
我的任务是将 HTML table 转换为二维数组,以便我可以将内容写入 CSV 文件。我对创建第二个数组维度的最佳方法很着迷。这是我目前所拥有的(带有示例数据):
$data = '<table style="width:100%"> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr> </table> '
$data = [regex]::matches($data, '<table.*?>(.+)</table>')
$data = $data[0].Groups[1].value
$arr = @()
$arr = [regex]::matches($data, '<tr.*?>(.*?)</tr>') | % {$_.Groups[1].value}
我现在有一个 <tr>
行数组(减去 <tr>
标签)。有没有办法接下来拆分 <td>
元素并从中创建一个数组数组?我可能会用蛮力解决这个问题,但我觉得有一种更简洁、可能更优化的方法。
顺便说一下,我使用的是 PowerShell v2。
如果你仔细看看到目前为止你有什么,你会注意到一个模式:你拿一个带有 HTML 片段的字符串,将它与正则表达式 <tag.*?>(.*?)</tag>
匹配,然后从匹配中提取捕获的组(括号之间的部分)。您对 <table>
标签和 <tr>
标签都这样做。使用相同的方法为每一行提取 <td>
标记的内容。
$arr | ForEach-Object {
[regex]::matches($_, '<td.*?>(.*?)</td>') | ForEach-Object {
$_.Groups[1].Value
}
}
[regex]::matches() | ForEach-Object {}
语句为每行提供 list/array 个 <td>
值。如果您通过在它们前面加上一元逗号运算符将这些列表附加到一个空数组,例如
$td = @()
$arr | ForEach-Object {
$td += ,@([regex]::matches($_, '<td.*?>(.*?)</td>') | ForEach-Object {
$_.Groups[1].Value
})
}
您将数组作为一个整体附加,而不是附加每个单独的元素,结果如下:
[ [ 'Jill', 'Smith', 50 ], [ 'Eve', 'Jackson', 94 ] ]
而不是平面数组:
[ 'Jill', 'Smith', 50, 'Eve', 'Jackson', 94 ]
结果不完全是一个二维数组(它实际上是一个数组数组,而二维数组将是一个二维数组)。不过,这就是您通常在 PowerShell 中处理此类事情的方式。
为了更好地了解您在这里究竟在做什么,您可能需要阅读 operators, arrays, and regular expressions。