2017-06-14 93 views
0

我是新手powershell用戶請耐心等待。我試圖解析HTML表在PowerShell中的標籤之間的字符串, 下面是HTMLPowershell提取本地html標記

<head> 
     <title>HTML TABLE</title> 
     </head><body> 
     <table> 
     <colgroup><col/><col/></colgroup> 
     <tr><th>TestcaseName</th><th>Status</th></tr> 
     <tr><td>abcd </td><td>First </td></tr> 
     <tr><td>xyz </td><td>Second </td></tr> 
     <tr><td>pqr </td><td>Third </td></tr> 
     </table> 
     </body> 
</html> 

這是我所試過的代碼

$arr = @() 
$path = "C:\test.html" 
$pattern = '(?i)<tr[^>]*><td[^>]*>(.*)</td><td>' 

Get-Content $path | Foreach {if ([Regex]::IsMatch($_, $pattern)) { 
      $arr += [Regex]::Match($_, $pattern) 
      } 
     } 
$arr | Foreach {$_.Value} 

預計產量

abcd 
xyz 
pqr 

但結果是

<tr><td>abcd </td><td> 
<tr><td>xyz </td><td> 
<tr><td>pqr </td><td> 

任何人都可以提到爲什麼標籤也是作爲輸出獲取以及如何避免這種情況。此外,我想追加文本到每個數組元素,例如:<a href="\\192.116.1.2\cluster_110">abcd, <a href="\\192.116.1.3\cluster_110">xyz等,請提及相同,因爲它涉及特殊字符。

回答

1

試試這個:

(?<=\<td\>)(.*?(?=\</td\>)) 

原因標籤被拾起的道理是一樣的標籤內被拾起。除非你指定,否則Regex會返回匹配的所有東西。您可以使用lookaround斷言來匹配文本,但將其從捕獲中排除,因此? < =和?=在上面的正則表達式中。

http://www.regular-expressions.info/lookaround.html

至於追加,你可以這樣做:

$Arr | Foreach {$Nope+ $_ + $ChuckTesta} 
$Begin + $Arr[0] + $End 

這樣做會隱含它從一個匹配字符串轉換;你被警告了。我認爲沒有辦法做到這一點,而保持一場比賽,但我可能是錯誤的假設。

1

如果文件總是將是有效的XML,你可以將它轉換爲XML,並完成類似下面的:

[xml] $xml = Get-Content $path 

$xml.SelectNodes("//tr") | 
    Where-Object {$_.ChildNodes.Count -gt 0 -and $_.ChildNodes[0].Name -eq 'td'} | 
    ForEach-Object {$_.ChildNodes[0].InnerText} 

您可以附加任何你喜歡的的foreach對象

內的結果