当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 周五乐趣:宝贝,这是 PowerShell!

作者:精品下载站 日期:2024-12-14 07:39:06 浏览:14 分类:玩电脑

周五乐趣:宝贝,这是 PowerShell!


[玩转系统] 周五乐趣:宝贝,这是 PowerShell!

我给自己的挑战是从表中获取数据并将其转换为 PowerShell 对象。当您从 PowerShell 控制台运行 Invoke-Webrequest(不使用 ISE)时,您将获得 ParsedHTML 的属性。通过此属性,您可以使用 Microsoft DOM(文档对象模型)来解析数据。我承认在使用 DOM 方面我还是个新手,但我已经做到了。无论如何……在查看页面源代码(您可以在任何浏览器中执行此操作)时,我了解到我想要的表格是页面中的第一个表格。那么让我们开始获取一些 PowerShell 结果。

$uri = "http://www.ssa.gov/OACT/babynames/index.html"

#get the data
$data = Invoke-WebRequest $uri

#get the first table
$table = $data.ParsedHtml.getElementsByTagName("table") | Select -first 1

我使用 DOM 中的 GetElementsByTagName 方法检索所有表,然后选择第一个表。表对象具有一些我本可以尝试解析的文本属性,但我决定采用不同的方法。该表包含我可以获得的行。

#get the rows
$rows = $table.rows

行集合中的第一项将是表标题。这些数据将成为我的对象属性。

#get table headers
$headers = $rows.item(0).children | select -ExpandProperty InnerText

现在,$headers 是每个表列中的字符串数组。现在是棘手的部分,可能有几种方法可以解决这个问题。我需要遍历剩余的表行并将每列与标题进行匹配,并最终创建一个自定义对象。我决定使用 For 枚举来遍历每一行,然后在每一行中使用标题再次枚举,并将每个条目添加到哈希表中,我最终可以将其转换为自定义对象。

#count number of rows
$NumOfRows = $rows | Measure-Object

#enumerate the remaining rows (skipping the header row) and create a custom object
for ($i=1;$i -lt $NumofRows.Count;$i++) {
 #define an empty hashtable
 $objHash=[ordered]@{}
 #get the child rows
 $rowdata = $rows.item($i).children | select -ExpandProperty InnerText 
 for ($j=0;$j -lt $headers.count;$j++) {
    #add each row of data to the hash table using the corresponding
    #table header value
    $objHash.Add($headers[$j],$rowdata[$j])
  } #for

  #turn the hashtable into a custom object
  [pscustomobject]$objHash
} #for

这是结果。

[玩转系统] 周五乐趣:宝贝,这是 PowerShell!

因为我的脚本正在将一个对象写入管道,所以我还可以执行诸如排序和选择之类的操作。

[玩转系统] 周五乐趣:宝贝,这是 PowerShell!

我不能保证此代码能够处理您遇到的每个表,但它可能会帮助您入门,并且您可以随时在 PowerShell.org 的论坛中寻求帮助。如果您正在寻找更多 Invoke-WebRequest 示例,您还可以查看获取啤酒列表和浏览 Trainsignal 课程。

享受!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯