解析HTML以导出特定表格的单元格内容

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

有一个 HTML 文件,使用“Invoke-WebRequest”导出到变量,我想从其中导出特定表中的内容。

$Result = Invoke-WebRequest 'https://www.dailyfaceoff.com/teams/anaheim-ducks/line-combinations'

不幸的是,使用 $result.parsedHTML 不会返回任何结果。因此我正在考虑使用正则表达式来查找字符串。这就是我寻求您帮助的地方。

要求采取的行动:

  • 在 HTML 文件中搜索 id=LW1 的表
  • 在此单元格中搜索 Hello World
  • 导出内容“Hello World”

HTML 结构:

<body ...>
    <div ...>
        <tbody>
            <td id="LW1">
                <a ....>
                    <span class="player-name">Hello World</span>
                </a>
            </td>
        </tbody>
    </div>
</body>

预先感谢您的任何意见或帮助!

尝试1:

$r = Invoke-WebRequest 'https://www.dailyfaceoff.com/teams/anaheim-ducks/line-combinations'
$table = $r.ParsedHtml.getElementsByTagName("table")

结果1: 没有输出,看起来 HTML 结构正在阻止解析操作。

尝试2:

$r = Invoke-WebRequest 'https://www.dailyfaceoff.com/teams/anaheim-ducks/line-combinations'
$string = ($r.Content | 
    where {$_ -match '^a href.*LW1.*\ title=.*>/span.*'}) -replace '.*>'

结果2: 正则表达式不匹配

powershell html-parsing getelementsbytagname invoke-webrequest
1个回答
1
投票

请不要尝试使用正则表达式解析 HTML,这是一个糟糕的主意。您可以使用 Com Object 在 PowerShell Core 和 Windows PowerShell 中执行此操作:

$com = New-Object -ComObject htmlfile
$com.write([System.Text.Encoding]::Unicode.GetBytes(@'
<body>
  <div>
    <tbody>
      <td id="LW1">
        <a><span class="player-name">Hello World</span></a>
      </td>
    </tbody>
  </div>
</body>
'@))

$com.getElementsByClassName('player-name') | ForEach-Object innerHtml
# Outputs: Hello World
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($com)

或者,您可以使用

XmlDocument

$xml = [xml]::new()
$xml.LoadXml(@'
<body>
  <div>
    <tbody>
      <td id="LW1">
        <a><span class="player-name">Hello World</span></a>
      </td>
    </tbody>
  </div>
</body>
'@)
$xml.SelectSingleNode("//span[@class='player-name']").InnerText
© www.soinside.com 2019 - 2024. All rights reserved.