【问题标题】:Parse through related tags in HTML解析HTML中的相关标签
【发布时间】:2015-01-02 13:03:37
【问题描述】:

我需要在 Powershell 中从outerHTML 下方提取 item-name、item-manufacturer、item-actual。

<DIV class=row>
<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">

渲染后的输出如下所示:

Spasmonil (20mg) - Cipla Limited - Rs. 6
Sprintas (75mg) - Intas Laboratories Pvt - Rs. 5.72

我这样做的效率很低,我在不同的 txt 文件中得到了 4 个输出(drugsname、drugsquan、drugsric、drugmanu),然后我手动将它们组合起来。有人可以帮助我以某种优雅的方式做到这一点。

$regex1 = 'item-name.*?>(.*?)</A>'
$regex2 = 'text-small>(.*?)</DIV>'
$regex3 ='"item-manufacturer visible-xs">(.*?)</DIV>'
$regex4 ='item-actual>(.*?)</DIV>'

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

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

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

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

$drugsname > "d:\users\desktop\HKD\($control)drugsname.txt"
$drugsquan > "d:\users\desktop\HKD\($control)drugsquan.txt"
$drugsmanu > "d:\users\desktop\HKD\($control)drugsmanu.txt"
$drugspric > "d:\users\desktop\HKD\($control)drugspric.txt"

【问题讨论】:

  • 感谢您指出这一点。如果我们不使用Regex来解析HTML,那么应该使用什么?
  • 您可以将输入解释为 XML:[xml]$data = $contentFromWeb

标签: regex powershell


【解决方案1】:

在此处的字符串中使用多行/单行正则表达式(又名“罐装大虾”):

$data = 
@'
<DIV class=row>
<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">
'@

[regex]$regex = 
@'
(?ms).*?<DIV class=row>.*?
.+?item-name href=".+?>(.+?)</A>.*?
.+?text-small>(.+?)</DIV>.*?
.+?item-manufacturer.+?>(.+?)</DIV></DIV>.*?
.+?item-actual>(.+?)</DIV>
'@

$regex.Matches($data) |
foreach {
          [PSCustomObject]@{
          Name = $_.Groups[1].value
          Quantity = $_.Groups[2].Value
          Manufacturer = $_.Groups[3].Value
          Price = $_.Groups[4].Value
        }
}

Name                       Quantity                   Manufacturer               Price                    
----                       --------                   ------------               -----                    
Spasmonil (20mg)           2 ml                       Cipla Limited              Rs. 6                    
Sprintas (75mg)            28 Tablets                 Intas Laboratories Pvt Ltd Rs. 5.72                 

现在您有了一个对象集合,您可以根据需要进行排序、过滤、格式化和导出。

【讨论】:

  • 这真是太棒了,所以我删除了我的答案。你的得到我的投票。
  • 谢谢。对不起,我很天真,但我需要这样的东西:$data=@'get-content $ie.Document.body.outerHTML'。由于上述所有 HTML 数据都在 $ie.Document.body.outerHTML 中传递到我的程序中。你能告诉我如何改变“$data="
  • @MickyBalladelli - 谢谢! Yogesh - 它可以将所有数据(多行)作为单个多行字符串处理。它应该使用 $ie.Document.body.outerHTML 而无需修改 - 只需将其替换为 $data。如果它在文件中,请使用 Get-Content -Raw 将文件作为单个多行字符串读取。
猜你喜欢
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2016-05-06
  • 2012-10-01
相关资源
最近更新 更多