所以我有一个第三方生成的HTML文件,每天通过电子邮件发送给我(和我的小组)。它包含一个ID no,名称和多个电子邮件地址表(如果适用)。它用于更新AD中的组成员身份,我希望能够在powershell中执行此操作,因为组成员身份更新部分很容易。用于提取电子邮件地址的解析HTML文件(也是它们的AD用户名)是最难的部分。我有点傻了。我已经尝试过使用HTMLAgilityParser,它看起来并不适用于我的目的。如果我能够以某种方式将数据转换为.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>John_Smith@addr</span>
</td>
</tr>
答案 0 :(得分: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
}
答案 1 :(得分:0)
我对发布这个答案毫不犹豫,因为它对这种情况非常具体,但这可以通过简单的字符串方法来完成。首先获取html文件的内容:
$htmlContent = Get-Content -Path 'thePath\andFile.html'
接下来,从包含您要查找的值的html数据中选择字符串。这部分绝对特定于你的html结构:
$stringsWithDesiredValues = $htmlContent.Where({$_ -like '*<span class=font8>*'})
现在我们可以使用foreach并使用'&gt;'的索引和'&lt;'获得只有所需值的子字符串。
foreach($htmlString in $stringsWithDesiredValues){
$firstIndex = $htmlString.IndexOf('>') + 1
$lastIndex = $htmlString.LastIndexOf('<')
$lengthOfSubstring = $lastIndex - $firstIndex
$desiredValue = $htmlString.Substring($firstIndex,$lengthOfSubstring)
$desiredValue}
当然我在这里没有做任何具有所需值的事情,但是这个脚本会写出值,这样你就可以看到它们是正确的。显然,您可以在循环中捕获这些值,并按照您的意愿处理它们。一个丑陋的解决方案,我只发布它,因为没有其他答案建议。