要求:我想从网页上获取所有产品名称的名称。
问题陈述:
在完整加载页面之后,我在下面应用了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 }
答案 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