当我尝试从脚本中描述的网页上的表格中读取内容时,出现错误。任何人都可以帮我找到解决方案来修复它。谢谢。
$wc = New-Object System.Net.WebClient
$res = $wc.DownloadString('https://datatables.net/examples/data_sources/ajax.html')
$html = ConvertFrom-Html -Content $res
$BookDetails=[System.Collections.ArrayList]::new()
$BookDetails+=$n
$table = $html.SelectNodes('//table') | Where-Object { $_.HasClass('display dataTable') }
foreach ($row in $table.SelectNodes('//tr') | Where-Object { $_.HasClass("odd", "even")} )
{
$cnt += 1
#$name=$row.SelectSingleNode('th').innerText.Trim()
$value=$row.SelectSingleNode('td').innerText.Trim() -replace "\?", " "
$new_obj = New-Object -TypeName psobject
$new_obj | Add-Member -MemberType NoteProperty -Name $name -Value $value
$BookDetails+=$new_obj
}
Write-Output 'Extracted Table Information'
$table
Write-Output 'Extracted Book Details Parsed from HTML table'
$BookDetails
System.Net.WebClient
类通过其.DownloadString()
方法以及PowerShell的Web cmdlet - Invoke-WebRequest
和Invoke-RestMethod
- 只能检索static HTML 源代码,而不是动态渲染 HTML。
直接的问题是:
注:
以下内容基于
ConvertFrom-Html
模块中的
PSParseHTML
cmdlet,其使用问题中的代码暗示。
ConvertFrom-Html
从 HtmlAgilityPack.NET 库返回
HtmlAgilityPack.HtmlNode
实例。虽然下面的解释指向解决方案,但它们是假设的,因为它们需要动态 HTML 来操作,这
$_.HasClass('display dataTable')
查找字面上名为 display dataTable
的 single类名,而动态生成的 HTML 中的
class="display dataTable"
表示该元素具有 two 类,display
和 dataTable
。因此,您的方法调用始终返回 $false
。
因此,
$table = ...
赋值最终为$null
,然后可以预见地导致尝试调用其上的方法失败。具体来说,$table.SelectNodes('//tr')
会导致错误You cannot call a method on a null-valued expression.
您正在寻找的逻辑可能是查找具有
display
类以及 dataTable
类的元素,这需要 $_.HasClass("display") -and $_.HasClass("dataTable")
$_.HasClass("odd", "even")
would 已经成为一个问题,因为该方法只接受一个单个字符串)。
odd
或类even
的元素,这需要$_.HasClass("odd") -or $_.HasClass("even")