2010-08-31 118 views
2

我有两部分需要修复的问题。我会尽我所能来形容它,然后打破我“认为”的步骤。使用PowerShell或VBS从HTML文件中提取表格

我想在网页中获取特定的表格并将其发送给我自己。我想使用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 
+0

这是一个一次性的任务,或者说要进行自动化的一段较长的时间?这是为客户还是为管理员? – 2010-08-31 01:41:39

+0

自动化。管理员。 – 2010-08-31 18:42:12

回答

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> 

只是代替0widthborder300px为您正则表达式如:

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

小时匹配多个表的情况下,你必须从-match,开关,是一个布尔运算符,只是希望找到一个匹配选择字符串,它可以找到所有匹配,例如:

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} 
+0

关闭。令人沮丧的关闭甚至。 :) 看起来像有两个实例

但$匹配只显示0和1这些都不是我是表试图抓住。我究竟做错了什么? ARGHGHGHGGH!大声笑! PS 这是你迄今为止的帮助。 – 2010-08-31 18:49:11

+0

在这种情况下,您需要匹配表的所有实例。查看更新后的答案。 – 2010-08-31 20:28:13

+0

谢谢先生!得到它了。 :) – 2010-08-31 22:21:18

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的问题。

0

我认为HuddleMasses获取的Web的cmdlet有一个选项表作为XML阅读。

1

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

若要获取-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 
    } 

希望这有助于