使用 PowerHTML 模块从 Powershell 上的动态内容表进行网页抓取

问题描述 投票:0回答:1

当我尝试从脚本中描述的网页上的表格中读取内容时,出现错误。任何人都可以帮我找到解决方案来修复它。谢谢。

$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
powershell web-scraping html-agility-pack
1个回答
0
投票
  • 基本问题是

    System.Net.WebClient
    类通过其
    .DownloadString()
    方法以及PowerShell的Web cmdlet -
    Invoke-WebRequest
    Invoke-RestMethod
    - 只能检索static HTML 源代码,而不是动态渲染 HTML。

  • 直接的问题是:

    • 注:

      • 以下内容基于

        ConvertFrom-Html
         模块中的 
        PSParseHTML
        cmdlet,其使用问题中的代码暗示。

      • 虽然下面的解释指向解决方案,但它们是假设的,因为它们需要动态 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")
© www.soinside.com 2019 - 2024. All rights reserved.