【问题标题】:PowerShell - Cannot reference attributes of elements in array returned by .getElementsByTagName()PowerShell - 无法引用 .getElementsByTagName() 返回的数组中元素的属性
【发布时间】:2016-06-29 21:54:23
【问题描述】:

我正在通过 .getElementsByTagName() 从网页中检索一组元素。然后我循环遍历数组并打印出元素的标题:

$links = $ie.document.GetElementsByTagName("a")
Foreach($link in $links)
{
    $link.title
}

这行得通。然而 for 循环更适合我的需要,而且这似乎只打印出空行:

$links = $ie.document.GetElementsByTagName("a")
for($i=0; $i -lt $links.length; $i++)
{
    $links[$i].title
}

为什么第二个循环不打印标题?

【问题讨论】:

  • 在这两种情况下我都会使用 PowerGui 检查对象 $links 并确保它们属于同一类型,并且 PowerShell 不会以某种方式强制转换它们...
  • 可能的确认,重复:stackoverflow.com/questions/17625309/…

标签: html powershell


【解决方案1】:

下面的6种方法都打印所有链接标题,除了Select-Objecttitle属性缺失时也会打印一个空行:

$requestUri = "http://google.com"

$ie = New-Object -ComObject "InternetExplorer.Application"
$ie.Navigate($requestUri)
while($ie.Busy) { Start-Sleep -Milliseconds 250 }
$links = $ie.Document.getElementsByTagName("a")

Write-Warning "ForEach-Object:"
$links | ForEach-Object { $_.title }

Write-Warning "Select-Object:"
$links | Select-Object title

Write-Warning "foreach:"
foreach($link in $links) { $link.title }

Write-Warning "for (from 0):"
for($i = 0; $i -lt $links.Length; $i++) {
    $links[$i].title
}

Write-Warning "for (from 1):"
for($i = 1; $i -le $links.Length; $i++) {
    $links[$i].title
}

Write-Warning "while:"
$i = 0
while($links[$i]) {
    $links[$i].title
    $i++
}

$ie.Quit()

你能尝试在你的系统上运行它吗?

【讨论】:

  • 对,我已经修改了答案。
  • 我安装了 PowerShell v5,我猜你有 v2 或 v3。我正在多个版本的 atm 上运行测试。
  • 没错,我有 v3。我相信 v2 在它支持的 DOM 方法方面更加缺乏。
  • 对。因此,要么升级 PowerShell 版本,要么使用与 v3 兼容的方法之一。
  • 是的,您提到的带有 where 子句的 Select-Object 方法实际上对我来说更可取,而不是显式循环遍历所有元素。谢谢!
【解决方案2】:

我猜$links = $ie.document.GetElementByTagName("a") 和 和 $links = $varDiv.GetElementsByTagName("a") 不等效,因为它们没有为您提供相同的对象类型。

【讨论】:

  • 哎呀。它们都是从 div 中的元素子集提取的,但为了简洁起见,我打算在这里将它们都编辑为从整个文档中提取。已编辑。
猜你喜欢
  • 2014-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多