PowerShell使用regex和Invoke-WebRequest捕获网站数据

时间:2015-07-18 00:35:58

标签: regex powershell powershell-v3.0

当我在网站上显示时,我正试图捕捉这个广播电台正在播放的歌曲,我正在编写剧本的开头,到目前为止,我有以下代码:

$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不同。

1 个答案:

答案 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输出(假设正则表达式匹配)。