许多页面更新后访问网页字符串内容

时间:2014-12-24 13:41:19

标签: regex powershell webclient-download downloadstring

要求:我想从网页上获取所有产品名称的名称。

问题陈述

在完整加载页面之后,我在下面应用了RegEX(运行良好)以获取此页面上所有产品的名称。我的问题是它仍然给我输出好像没有点击'加载更多'。即仅显示来自第一页的产品名称。我需要调整DownloadString,以便下面的$content考虑整页源(页面完全加载后)。

以下代码:此网页末尾有“加载更多”按钮。我运行以下脚本点击“加载更多”按钮,然后单击它直到显示完整页面。这部分问题在另一个SO问题中解决,并且运行正常。

$ie = New-Object -COMObject InternetExplorer.Application
$ie.visible = $true
$site = $ie.Navigate('https://www.xxx.com/search/all?name=sporanox')
$ie.ReadyState

while($true)
{
    while ($ie.Busy -and $ie.ReadyState -ne 4){ sleep -Milliseconds 100 }
    try { 
        $link = $ie.Document.get_links() | where-object {$_.innerText -eq 'Load More'}
        if ($link -ne $null)
        {
            if ($link.clientHeight -eq 0)
            {
                break
            }
            $link.click()
        }
        else
        {
            break
        }
    }
    catch
    {
        break
    }
}


$regex = [RegEx]'"item-name prdctNm">(.*?)</a>'
$url = ‘https://www.xxx.com/search/all?name=sporanox’
$wc = New-Object System.Net.WebClient
$content = $wc.DownloadString($url)
$regex.Matches($content) | ForEach-Object { $_.Groups[1].Value }

1 个答案:

答案 0 :(得分:1)

而不是再次调用页面(这将是第二个实例并且与您之前执行的操作没有关联),而不是OuterHTML

$ie.Document.body.outerHTML 

包含这样的数据

<DIV class="col-sm-5 col-xs-8"><A class=item-name href="/details/drugs/39467/spasmonil-20mg">Spasmonil (20mg)</A>
<DIV class=text-small>2 ml</DIV>
<DIV class="item-manufacturer visible-xs">Cipla Limited</DIV></DIV>
<DIV class="col-sm-5 hidden-xs"><SPAN class=item-manufacturer>Cipla Limited</SPAN></DIV>
<DIV class="col-sm-2 col-xs-4 text-right">
<DIV class=item-actual>Rs. 6</DIV>
<DIV class=item-price>Rs. 6</DIV></DIV></DIV></LI>
<LI class="list-item item js-drug">
<DIV class=row>
<DIV class="col-sm-5 col-xs-8"><A class=item-name href="/details/drugs/40759/sprintas-75mg">Sprintas (75mg)</A>
<DIV class=text-small>28 Tablets</DIV>
<DIV class="item-manufacturer visible-xs">Intas Laboratories Pvt Ltd</DIV></DIV>
<DIV class="col-sm-5 hidden-xs"><SPAN class=item-manufacturer>Intas Laboratories Pvt Ltd</SPAN></DIV>
<DIV class="col-sm-2 col-xs-4 text-right">
<DIV class=item-actual>Rs. 5.72</DIV>
<DIV class=item-price>Rs. 5.72</DIV></DIV></DIV></LI>
<LI class="list-item item js-drug">

在while循环之后拥有该行可以获得所需的内容。将尝试并帮助解析这是你想要的数据我会想。

必须有一种更好的解析方法,但我还不熟悉HTML / XML解析。我需要更改你的字符串以匹配返回的文本,但这两个都是有用的结果。

$regex = 'item-name.*?>(.*?)</A>' 
$ie.Document.body.outerHTML | Select-String -Pattern $regex -AllMatches | Foreach {$_.Matches} | ForEach-Object {$_.Value}

$drugs = $ie.Document.body.outerHTML -split "`r`n" | ForEach-Object{
    If($_ -match $regex){
        $Matches[1]
    }
}

只有在$drugs中存储为字符串数组的药物名称,梯子表现更好。截至我写这篇文章时,它返回了528个条目

...truncated output...
Spentron
Spencitron
Speucid Tab
Spasnil Drop (15ml)
Sparmex Tab
Spye Tab