0

所以我有一个从第 3 方生成的 HTML 文件,它每天都会通过电子邮件发送给我(和我的小组)。它包含一个 ID 号、姓名和多个电子邮件地址(如果适用)的表格。它用于更新 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>
4

2 回答 2

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
}
于 2013-08-28T07:22:56.560 回答
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}

当然,我在这里没有对期望的值做任何事情,但是这个脚本会写出这些值,这样你就可以看到它们是正确的。您显然可以在循环中捕获这些值并按照您的意愿处理它们。可以肯定的是,这是一个丑陋的解决方案,我只发布了它,因为没有其他答案建议。

于 2015-07-30T20:49:09.697 回答