2013-08-27 87 views
0

因此,我有一個由第三方生成的HTML文件,每天都會通過電子郵件發送給我(和我的組)。它包含一個ID號碼錶,名稱和多個電子郵件地址(如果適用)。它用於更新AD中的組成員身份,我希望能夠在PowerShell中執行此操作,因爲組成員身份更新部分非常簡單。解析HTML文件來拉取電子郵件地址,這也是他們的AD用戶名,是艱難的部分。我有點殘酷。我試過使用HTMLAgilityParser,它似乎不適合我的目的。如果我能以某種方式將數據轉換爲.CSV以便於使用,那將非常棒。使用powershell將HTML文件轉換爲.CSV

我需要的是A)直接從HTML中拉取電子郵件地址並將它們放入CSV文件中或B)將HTML文件轉換爲.CSV進行解析。

原因是這些數據每天都會發布,因此必須進行自動化處理。

謝謝!從HTML文件

樣品,所有的識別信息已被刪除和/或調整:

<table> 
<tr> 
<td class=xl27> 
<span class=font7>ID</span> 
</td> 
<td class=xl27> 
<span class=font7>Name</span> 
</td> 
<td class=xl27> 
<span class=font7>Primary E-Mail</span> 
</td> 
<td class=xl27> 
<span class=font7>Alternate E-Mail</span> 
</td> 
</tr> 
<tr> 
<td class=xl28> 
<span class=font8>00000000</span> 
</td> 
<td class=xl28> 
<span class=font8>Smith,John R</span> 
</td> 
<td class=xl28> 
<span class=font8></span> 
</td> 
<td class=xl28> 
<span class=font8>[email protected]</span> 
</td> 
</tr> 
+0

你可以發佈如何HTML文件的樣子? – Mitul

+0

根本沒有正確格式化...編輯到原始帖子 – Koecerion

+0

用代碼和正確的格式更新您的問題。 – Mitul

回答

0

這裏是一個解決方案的開始,也不是那麼好...... 它假設是HtmlAgilityPack.dll是在目錄腳本文件的Html-Agility-Pack目錄中。

Add-Type -Path "$(Split-Path -parent $PSCommandPath)\Html-Agility-Pack\HtmlAgilityPack.dll" 


$webGraber = New-Object -TypeName HtmlAgilityPack.HtmlWeb 
$webDoc = $webGraber.Load("C:\temp\t.htm") 
$trDatas = $webDoc.DocumentNode.ChildNodes.Elements("tr") 

Remove-Item "c:\temp\t.csv" 

foreach ($trData in $trDatas) 
{ 
    $tdDatas = $trData.elements("td") 
    $line = "" 
    foreach ($tdData in $tdDatas) 
    { 
    $line = $line + $tdData.InnerText.Trim() + ',' 
    } 
    $line.Remove($line.Length -1) | Out-File -FilePath "c:\temp\t.csv" -Append 
} 
+0

你測試過了嗎?我在PC上添加了直接路徑到我的電腦上.dll,我沒有得到任何輸出。你使用什麼版本的.net和PowerShell?我的問題可能是我使用的PowerShell v1.0 ...我要更新,然後再試一次 – Koecerion

+0

我再次更新和嘗試。它在我看來,HTML文件沒有被加載,因爲我在設置$ trDatas變量時收到invokemethodonNull錯誤。 – Koecerion

+0

是的,我測試它。我使用PowerShell 3.0。你確定你是否使用PowerShell 1.0(XP?) – JPBlanc

0

我毫不猶豫地張貼這個答案,因爲它是非常具體到本案,不過這可以通過簡單的字符串方法來完成。首先獲取html文件的內容:

$htmlContent = Get-Content -Path 'thePath\andFile.html' 

接下來從包含您正在查找的值的html數據中選擇字符串。這部分是絕對具體到HTML的結構:

$stringsWithDesiredValues = $htmlContent.Where({$_ -like '*<span class=font8>*'}) 

現在我們可以使用foreach和使用「>」和「<」的索引來獲取子,只有所需的值。

foreach($htmlString in $stringsWithDesiredValues){ 
$firstIndex = $htmlString.IndexOf('>') + 1 
$lastIndex = $htmlString.LastIndexOf('<') 
$lengthOfSubstring = $lastIndex - $firstIndex 
$desiredValue = $htmlString.Substring($firstIndex,$lengthOfSubstring) 
$desiredValue} 

當然我沒有做這裏的期望的任何有價值的東西,但這個腳本會寫出來的值,所以你可以看到,他們是正確的。你顯然可以在循環中捕獲這些值,並對它們進行處理。可以肯定的一個難看的解決方案,我只發佈它,因爲沒有其他答案建議。