在PowerShell中将HTML片段转换为csv

时间:2017-07-09 19:23:33

标签: html powershell fragment

我正在尝试处理网络查询的结果。我在做

$data = Invoke-WebRequest $uri $data.RawContent

返回此

HTTP/1.1 200 OK Transfer-Encoding: chunked Expires: Thu, 01 Jan 1970 00:00:00 GMT Set-Cookie: JSESSIONID=19gbg0sejwxXXXXXXpzwlasaaeer;Path=/informer;Secure Server: Jetty(8.1.8.v20121106) <table><tr><td>username</td><td>firstname</td><td>lastname</td><td>idnumber</td><td>auth</td><td>course1</td></tr><tr valign="top"><td style="mso-number-format:'\@';">d_smith</td><td style="mso-number-format:'\@';">Daniel</td><td style="mso-number-format:'\@';">smith</td><td style="mso-number-format:'\@';">2221840</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-101</td></tr><tr valign="top"><td style="mso-number-format:'\@';">d_rutherford</td><td style="mso-number-format:'\@';">Daniel</td><td style="mso-number-format:'\@';">rutherford</td><td style="mso-number-format:'\@';">2223039</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-101</td></tr><tr valign="top"><td style="mso-number-format:'\@';">j_smithe21</td><td style="mso-number-format:'\@';">James</td><td style="mso-number-format:'\@';">smithe</td><td style="mso-number-format:'\@';">2221844</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-101</td></tr><tr valign="top"><td style="mso-number-format:'\@';">h_phillipsiii</td><td style="mso-number-format:'\@';">Harvey</td><td style="mso-number-format:'\@';">phillips III</td><td style="mso-number-format:'\@';">2221845</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-101</td></tr><tr valign="top"><td style="mso-number-format:'\@';">h_phillipsiii</td><td style="mso-number-format:'\@';">Harvey</td><td style="mso-number-format:'\@';">phillips III</td><td style="mso-number-format:'\@';">2221845</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-102</td></tr><tr valign="top"><td style="mso-number-format:'\@';">d_rutherford</td><td style="mso-number-format:'\@';">Daniel</td><td style="mso-number-format:'\@';">rutherford</td><td style="mso-number-format:'\@';">2223039</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-102</td></tr><tr valign="top"><td style="mso-number-format:'\@';">j_smithe21</td><td style="mso-number-format:'\@';">James</td><td style="mso-number-format:'\@';">smithe</td><td style="mso-number-format:'\@';">2221844</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-102</td></tr><tr valign="top"><td style="mso-number-format:'\@';">d_smith</td><td style="mso-number-format:'\@';">Daniel</td><td style="mso-number-format:'\@';">smith</td><td style="mso-number-format:'\@';">2221840</td><td style="mso-number-format:'\@';">ldap</td><td style="mso-number-format:'\@';">2017CE1-CTP-8001-102</td></tr><tr valign="top"><td></td></tr></table>

注意没有HTML或正文标记。我认为最好,这就是为什么我没有看到ParsedHTML选项。这些是$data下面显示的唯一属性$data Properties

$ data.Content返回字符代码以构成$ data.RawContent生成的文本。 这是在Web浏览器中呈现时的表 rendered table

如何将此表格转换为CSV或PSCustomObject或类似内容,以便我可以遍历这些行并过滤和处理数据?

1 个答案:

答案 0 :(得分:1)

由于响应是有效的XML,因此您可以使用PowerShells XML解析功能,如下所示:

$data = Invoke-WebRequest $uri
[xml]$x = $data.RawContent

$first = $true
$OldOFS = $OFS
$OFS = '","'

foreach ($tr in $x.table.tr)
{
    if ($first)
    {
        $first = $false
        """$($tr.td)""" | Out-File "out.csv"
    }
    elseif ($tr.td)
    {
        """$($tr.td.'#text')""" | Out-File "out.csv" -Append
    }
}

$OFS = $OldOFS

notepad out.csv

$OFS hack只是快速而肮脏,无法将数组转换为类似csv的东西。例如,您也可以使用-join运算符。

第一行中的$tr.td生成一个标题字符串数组,$tr.td.'#text'为每个剩余的非空行生成值数组。

希望有所帮助。