当我在网站上显示时,我正试图捕捉这个广播电台正在播放的歌曲,我正在编写剧本的开头,到目前为止,我有以下代码:
$webpage = (Invoke-WebRequest http://www.2dayfm.com.au).Content
$regex = [regex]"(.*nowPlayingInfo.*span)"
$regex.Match($webpage).Value.Split(">")[4].Replace("</span","")
这会捕获代码中列出的网站,但是有两个问题。
首先,当运行此代码时,它会返回正在加载... 原因,如果我查看结果:
(Invoke-WebRequest http://www.2dayfm.com.au).Content | clip
将其粘贴到记事本中,如果我搜索“正在播放:”,则会显示以下内容:
<p><span class="listenHeading">Playing:</span> <span id="nowPlayingInfo">Loading...</span></p>
当我在我的代码中运行 Invoke-WebRequest 时,它会在该时间点捕获网站,并在现实生活中看到这一点,在浏览器中导航到http://www.2dayfm.com.au/并且看看正在播放的歌曲的顶部,它在歌曲实际加载之前的短时间内显示正在加载... 。
我希望的另一件事是删除代码的第二行并在第一行清理正则表达式,所以我不需要使用尽可能多的Split&amp;替换方法。
我试图让它工作的另一种方法是从Chrome检查元素复制XPATH,使用像
这样的用法(Invoke-WebRequest -Uri 'http://www.2dayfm.com.au').Content | Select-Xml -XPath '//*[@id="nowPlayingInfo"]'
但这似乎也不起作用,就像它不接受XPATH一样,XPATH Chrome认为它与PowerShell期望的XPATH不同。
答案 0 :(得分:4)
使用刮刀无法正常工作,因为您只获得了下载的初始html内容。该页面使用Javascript / Ajax通过在初始下载后操作DOM 来呈现歌曲/艺术家信息。但是,您可以使用InternetExplorer.Application COM对象执行此操作:
$ie = New-Object -comObject InternetExplorer.Application
$ie.navigate('http://www.2dayfm.com.au/')
while ($ie.ReadyState -ne 4) { Start-Sleep -Seconds 1 } # need timeout here
$null = $ie.Document.body.innerhtml -match '\s+id\s*=\s*"nowPlayingInfo"\s*>(.*)</span'
$ie.Quit()
$matches[1]
输出:
Little Mix, Black Magic
$null =
位是为了摆脱True
运算符生成的-match
输出(假设正则表达式匹配)。