有一个 HTML 文件,使用“Invoke-WebRequest”导出到变量,我想从其中导出特定表中的内容。
$Result = Invoke-WebRequest 'https://www.dailyfaceoff.com/teams/anaheim-ducks/line-combinations'
不幸的是,使用 $result.parsedHTML 不会返回任何结果。因此我正在考虑使用正则表达式来查找字符串。这就是我寻求您帮助的地方。
要求采取的行动:
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: 正则表达式不匹配
请不要尝试使用正则表达式解析 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