从网站捕获数据

时间:2016-02-20 21:09:32

标签: powershell

这个网站https://ideone.com/GwB7Ba我试图使用Invoke-WebRequest从中获取前50首歌曲, class =“item-title”中有两个类class =“artist-name”我需要获取元素来收集正确的信息。

$top50raw1.ParsedHtml

然后我用:

$top50raw1.ParsedHtml.getElementById('dvChartItems')
$top50raw1.ParsedHtml.getElementsByTagName('div')

可以选择 getElementById getElementsByName getElementsByTagName 以及ID dvChartListingContainer dvChartItems

即使使用以下任何一种:

{{1}}

不起作用,我不确定如何使用网站中的正确元素来捕获正确的数据。

2 个答案:

答案 0 :(得分:1)

我使用Internet Explorer和RexEx的集团以不同的方式解决了这个问题。

$titles = $null
$artists = $null
$ie = New-Object -comObject InternetExplorer.Application
$ie.navigate('http://www.ariacharts.com.au/chart/singles')
Start-Sleep -Seconds 5
$rawtop50 = $ie | Select -ExpandProperty document
$titles += $rawtop50.getElementById('dvChartItems').innerHTML | Select-String -Pattern 'title="(.*?)"' -AllMatches | ForEach-Object {$_.Matches} | ForEach-Object {$_.Groups[1].Value}
$artists += $rawtop50.getElementById('dvChartItems').innerHTML | Select-String -Pattern 'artist-name[\s\S]*?data-reactid="[\s\S]*?">(.*?)<\/' -AllMatches | ForEach-Object {$_.Matches} | ForEach-Object {$_.Groups[1].Value}

$top50 = 0..49 | ForEach-Object{
    [pscustomobject][ordered]@{
        Position = $_ + 1 
        Song = $artists[$_] + " - " + $titles[$_]
    }
}

答案 1 :(得分:0)

使用InternetExplorer.Application确实解决了在Invoke-WebRequest的ParsedHtml中未找到“DIV”内容的问题。但我确实发现你收集数据的方式效率低下。两次调用'getElementByID',然后对数组进行循环以将它们聚集在一起似乎是'iffy'..

在我看来,一次查看一个'行/排名',以正确收集排名/艺术家/标题,保证数据彼此属于。此外,它加快了这个过程。

我在你的剧本上做了一个测量命令,而不是我的,我来了~3.5秒,平均为5.5秒。

希望这可以帮助您或任何想要解析HTML内容的人。

$ie = New-Object -comObject InternetExplorer.Application
$ie.navigate('http://www.ariacharts.com.au/chart/singles')

While ($ie.ReadyState -ne 4) { Sleep -Milliseconds 100 }

$ChartItems = ($ie.Document).getElementByID('dvChartItems')

ForEach ($Row in $ChartItems.childNodes) {

    $Rank = $Row.childNodes[0].childNodes[1].outerText
    $Title = $Row.childNodes[2].childNodes[0].outerText
    $Artist = $Row.childNodes[2].childNodes[1].outerText

    [PSCustomObject]@{ Rank = $Rank; Title = $Title; Artist = $Artist }

}