Regex 通过HTML中的相关标记进行解析

Regex 通过HTML中的相关标记进行解析,regex,powershell,Regex,Powershell,我需要在Powershell中从下面的outerHTML中提取项目名称、项目制造商、项目实际值 <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>

我需要在Powershell中从下面的
outerHTML
中提取项目名称、项目制造商、项目实际值

<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">
我正在以一种非常有效的方式进行这项工作,我在不同的txt文件中获得了4个输出(drugsname、drugsquan、drugspric、drugsmanu),然后我手动将其合并。有人能帮我优雅地做这件事吗

$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"
$regex1='item name.*?>(.*?)
$regex2='text small>(.*)'
$regex3=“‘物料制造商可见xs’>(.*)”
$regex4='item-actual>(.*)'
$drugsname=$ie.Document.body.outerHTML-split“`r`n”|
ForEach对象{
If($\匹配$regex1){
$matches[1]
}
}
$drugsquan=$ie.Document.body.outerHTML-split“`r`n”|
ForEach对象{
If($\匹配$regex2){
$matches[1]
}
}
$drugsmanu=$ie.Document.body.outerHTML-split“`r`n”|
ForEach对象{
If($\匹配$regex3){
$matches[1]
}
}
$drugspric=$ie.Document.body.outerHTML-split“`r`n”|
ForEach对象{
If($\匹配$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”

在here字符串中使用多行/单行正则表达式(也称为“罐头中的巨型虾”):

$data=
@'
2毫升
西普拉有限公司
西普拉有限公司
卢比6
6卢比
  • 28片 Intas实验室私人有限公司 Intas实验室私人有限公司 Rs.5.72 卢比5.72
  • '@ [regex]$regex= @' (?ms)。*?*? .+?项目名称href=“.+?>(.+?)*? .+?文本小>(.+?)*? .+?项目制造商.+?>(.+?)*? .+?项目实际值>(.+?) '@ $regex.Matches($data)| 弗雷奇{ [PSCustomObject]@{ 名称=$\组[1]。值 数量=$\组[2]。值 制造商=$\组[3]。值 价格=$\组[4]。价值 } } 名称数量制造商价格 ---- -------- ------------ ----- 痉挛宁(20mg)2毫升西普拉有限公司Rs.6 斯普林塔斯(75mg)28片Intas实验室私人有限公司Rs.5.72

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

    感谢您指出这一点。如果我们不使用正则表达式解析HTML,那么应该使用什么?您可以将输入解释为XML:[XML]$data=$CONTENTFROMWEB这真是太棒了,所以我删除了我的答案。你的答案会得到我的投票。谢谢。很抱歉我太天真了,但我需要这样的:$data=@'get-content$ie.Document.body.outerHTML'。因为上面所有的HTML数据都是在$ie.Document.body.outerHTML中传递到我的程序的。你能告诉我如何更改“$data”=“@MickyBalladelli-谢谢!Yogesh-它将所有数据(多行)作为一个单行、多行字符串进行处理。它应该使用$ie.Document.body.outerHTML而无需修改-只需将其替换为$data即可。如果它位于文件中,请使用Get Content-Raw将文件作为单个多行字符串读取。
    $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