【问题标题】:2D Array from HTML来自 HTML 的二维数组
【发布时间】:2016-12-05 07:20:02
【问题描述】:

我的任务是将 HTML 表格转换为二维数组,以便将内容写入 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}

我现在有一个&lt;tr&gt; 行数组(减去&lt;tr&gt; 标记)。有没有办法接下来拆分 &lt;td&gt; 元素并从中创建一个数组数组?我可能会蛮力解决这个问题,但我觉得有一种更清洁且可能更优化的方式。

顺便说一句,我使用的是 PowerShell v2。

【问题讨论】:

  • 这似乎是缺少的魔法线。如果有人在这里看到任何明显的错误,我会很高兴听到它们! 0..($arr.Length-1) | % { $arr[$_] = [regex]::matches($arr[$_], '&lt;td.*?&gt;(.*?)&lt;/td&gt;') | % {$_.Groups[1].value} }

标签: html arrays csv powershell powershell-2.0


【解决方案1】:

如果您仔细查看到目前为止的内容,您会注意到一个模式:您获取一个带有 HTML 片段的字符串,将其与正则表达式 &lt;tag.*?&gt;(.*?)&lt;/tag&gt; 进行匹配,然后提取捕获的组(之间的部分括号)从匹配。您对&lt;table&gt; 标记以及&lt;tr&gt; 标记执行此操作。使用相同的方法提取每一行的&lt;td&gt;标签的内容。

$arr | ForEach-Object {
  [regex]::matches($_, '<td.*?>(.*?)</td>') | ForEach-Object {
    $_.Groups[1].Value
  }
}

[regex]::matches() | ForEach-Object {} 语句为您提供每行的&lt;td&gt; 值的列表/数组。如果您通过在它们前面加上一元逗号运算符来将这些列表附加到一个空数组中,就像这样

$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 中处理此类事情的方式。

为了更好地了解您在这里的具体操作,您可能需要阅读operatorsarraysregular expressions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2016-02-06
    • 2010-10-01
    • 2012-03-22
    • 2013-11-08
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多