使用PowerShell或VBS从HTML文件中提取表

时间:2010-08-31 01:22:30

标签: .net windows regex powershell vbscript

我有一个需要修复的两部分问题。我会尽力描述它,然后分解我“想”的步骤。

我正在尝试在网页中获取特定的表格并通过电子邮件发送给自己。

目前我正在尝试的是使用GNU \ Win32 wget.exe(我宁愿本地使用PowerShell但由于某种原因我不能,也许是因为我使用的方法无法呈现ASPX页面?) 使用wget我能够制作ASPX页面的本地html版本。

现在我一直在尝试解析文件并提取特定的表。在这种特殊情况下,表格以<table border="0" cellpadding="2" cellspacing="2" width="300px">开头,以</table>结尾,并且没有嵌套表格。

我已经在我的问题上抛出了一些正则表达式(是的,我知道正则表达式可能不是我需要的工具),但无济于事。

--- Ammended 这就是我现在所处的位置......

$content = (new-object System.Net.WebClient).DownloadString($url)
$found = $content -cmatch '(?si)<table border="0" cellpadding="2" cellspacing="2" width="300px"[^>]*>(.*?)Total Queries</td>(.*?)</tr>(.*?)</table>'
$result = $matches[3]
$result

4 个答案:

答案 0 :(得分:5)

我用PowerShell做过这种事情。这非常简单:

PS> $url = "http://www.windowsitpro.com/news/PaulThurrottsWinInfoNews.aspx"
PS> $content = (new-object System.Net.WebClient).DownloadString($url)
PS> $content -match '(?s)<table[^>]+border\s*=\s*"0"\s*.*?>(.*?)</table>'
True
PS> $matches[1]

        <tr>
          <snip>
        </tr>

只需将width替换为border,将300px替换为0代表您的正则表达式:

PS> $content -match '(?s)<table[^>]+width\s*=\s*"300px"\s*.*?>(.*?)</table>'

在匹配多个表的情况下,你必须从-match切换,这是一个布尔运算符,只是想找到一个匹配的Select-String,它可以找到所有的匹配,例如:

PS> $pattern = '(?s)<table[^>]+width\s*=\s*"300px"\s*.*?>(.*?)</table>'    
PS> $content  | Select-String -AllMatches $pattern | 
                Foreach {$_.Matches | $_.Group[1].Value}

基本上所有匹配都在$ _.matches集合中。如果您知道该表总是第三个,您可以这样访问:

... | Foreach {$_.Matches[2].Group[1].Value}

答案 1 :(得分:1)

前段时间我写了一个名为Get-MarkupTag的函数。这使您不必直接使用正则表达式(它在封面下这样做)。它还试图将HTML转换为XML,此时获取数据非常简单。

要使用Get-MarkupTag执行此操作,您需要执行类似

的操作
$webClient = New-Object Net.Webclient -Property @{UseDefaultCredentials=$true}
$html = $webClient.DownloadString($url)
$table = Get-MarkupTag -html $html -tag "table" |
    Where-Object { $_.Tag -like '<table border="0" cellpadding="2" cellspacing="2" width="300px">*' } |
    Select-Object -expandProperty Xml
$table.tr |  # Row
    Foreach-Object {
        $_.Td # Column
    }

希望这有帮助

答案 2 :(得分:0)

我会用VBScript以这种方式处理它。

  • 用单引号删除所有双引号,只是为了便于阅读和阅读编写代码。即myHTMLString = Replace(myHTMLString, """", "'")

  • 确定文件是否包含您的表格。听起来它没有idname属性。太糟糕了,但如果不这样做,请使用InStr来确定表的起始位置。 Dim tableStartsAt = InStr(myHTMLString,"<table border='0'")小心这里的所有属性,因为你受到桌子的摆布,它的属性在没有你注意的情况下移动了!也许当找不到匹配的表格时,请将这些统计信息通过电子邮件发送给您自己,作为需要进行一些维护的警告。

  • 现在你有了表的起始位置,找到它的结束标记。即Dim tableEndsAt = InStr(tableStartsAt,myHTMLString,"</table>")

  • 获取HTML字符串:Dim myTable = Mid(myHTMLString,tableStartsAt,tableEndsAt-tableStartsAt)

  • 将其放入email, send using VBScript。确保您拥有Mail.IsHTML = True。这是另一个VBScript sending email问题。

答案 3 :(得分:0)

我认为HuddleMasses Get-Web cmdlet可以选择将表读入XML。