1

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

问题陈述

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

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

$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 }
4

1 回答 1

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
于 2014-12-24T14:00:01.920 回答