我有两个部分需要修复的问题。 我会尽我所能来形容它,然后打破我所“想”的步骤。
我正在试图在网页中获得一个特定的表格,并通过电子邮件发送给我自己。
目前我正在尝试使用GNU \ Win32 wget.exe
(我宁愿使用PowerShell本身,但出于某种原因,我不能,也许是因为我使用的方法无法呈现ASPX页面?)使用wget
我能够制作一个本地html版本的ASPX页面。
现在我一直试图parsing文件并提取一个特定的表。 在这种特殊情况下,表格以<table border="0" cellpadding="2" cellspacing="2" width="300px">
开始,以</table>
结尾,并且没有嵌套表格。
我对我的问题抛出了一些正则expression式(是的,我知道正则expression式可能不是我需要的工具),但无济于事。
—赞美这里是我现在的地方…
$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
我用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
代替width
为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}
前一段时间,我写了一个名为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 }
希望这可以帮助
我会用VBScript来解决这个问题。
删除所有双引号单引号,只是为了方便阅读和编写代码。 即myHTMLString = Replace(myHTMLString, """", "'")
确定文件是否包含你的表。 听起来像它没有一个id
或name
属性。 太糟糕了,但失败了,使用InStr
来确定表的起始位置。 Dim tableStartsAt = InStr(myHTMLString,"<table border='0'")
小心所有的属性,因为你摆在桌子的摆布,它的属性四处移动,你没有注意到! 也许当没有找到匹配的表格时,发邮件给你自己作为警告,说明需要维护。
现在你有你的表的开始位置,找到它的结束标签。 即Dim tableEndsAt = InStr(tableStartsAt,myHTMLString,"</table>")
获取HTML字符串: Dim myTable = Mid(myHTMLString,tableStartsAt,tableEndsAt-tableStartsAt)
把它放到电子邮件中,用VBScript发送 。 确保你有Mail.IsHTML = True
。 这是另一个VBScript发送电子邮件的问题。
我认为HuddleMasses Get-Web cmdlet可以选择以XML格式读取表格。