将网页内容保存到变量中

时间:2015-01-01 00:13:05

标签: powershell

我确信我的大脑一分钟都在缩小......

我正在做的是检索网页,获取一些信息并通过电子邮件发送这些信息,所有这些都来自powershell。电子邮件部分工作正常但我在网页处理部分遇到了一些问题。 我最初的想法是获取页面,将其下载到临时文件,进行处理然后删除文件。然后我记得大约12年前在TCL中做一个类似的脚本,我的方法是将页面内容传递给变量然后调用变量来使用regexp处理数据。

$storageDir = "C:\Users\me\Documents"
$browser=new-object system.net.webclient
$browser.UseDefaultCredentials = $true
$browser.downloadfile("http://whatever.com/cgi-bin/search_detail.cgi?num=01","$storageDir\Download1.HTML")

以上将保存我的文件以进行处理,但就像我说的那样,我认为传递给变量更好更清晰,不知道如何在powershell中执行此操作。

我正在搜索以下3个标签。所有这些领域最终都会出现,我不需要回报。 这些是我有兴趣将字符串传递给变量的字段和字段格式:

此字段将为字母数字

CAL_ID:</font><td>tt1234 &nbsp;

此字段为字母

CAL_FIRST:</font><td>TILAHUN &nbsp;

此字段将是一个电话号码,格式可能会有所不同,它应该如图所示,但可以在没有任何电话分隔符的情况下输入,也可以输入区域代码,空格等的常用()。

CAL_NE:</font><td>123-456-7890 &nbsp;

通常在TCL中我会在调用http包后做过类似的事情:

set posting [::http::geturl http://whateever.com/searchonly -query query]
set raw_data [::http::data $posting]

然后使用$ raw_data中页面的内容来获取我的变量,例如:

set data [regexp -all -inline -- {CAL_ID:</font><td>([^\>]*) &nbsp;} $raw_data]

等我需要的其他领域。

我的头脑没有工作而感到沮丧。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

需要从一个小前锋开始。所以你认为将html下载到文件效率不高?在这种情况下,可能是因为您首先进行了一些数据提取。为什么不直接使用$browser.DownloadString

$html = $browser.DownloadString(....)

好的,我们在变量$html中有html,我们需要提取行中的数据。出于测试目的,这是我用于$html的内容。

This field will be alphanumeric
CAL_ID:</font><td>tt1234 &nbsp;
This field will be letters
Thivll be letters
s field wiCAL_FIRST:</font><td>TILAHUN &nbsp;
This field will be a phone number and the format can vary, it should be as shown but it can be input without any phone separators or the usual () for the area code, spaces and such.
s field wiCAL_NE:</font><td>123-456-7890 &nbsp;

以下是提取数据的代码。

$html | select-string -Pattern 'CAL_(ID|FIRST|NE).*?&nbsp;' -AllMatches | 
        ForEach-Object{$_.Matches} |
        Select-Object -ExpandProperty Value |
        ForEach-Object{
            $_ -replace [regex]::escape("</font><td>") -replace " &nbsp;" -replace ":","=" | ConvertFrom-StringData
}

示例输出

Name                           Value                                                                                                                                        
----                           -----                                                                                                                                        
CAL_ID                         tt1234                                                                                                                                       
CAL_FIRST                      TILAHUN                                                                                                                                      
CAL_NE                         123-456-7890  

使用Select-String我们找到以“CAL_”开头的所有数据以及以下ID之一,FIRST或NE。抓住所有东西,直到下一次出现“”。然后我们采用看起来像这样的数据(基于前面提到的样本。)

CAL_ID:</font><td>tt1234 &nbsp;
CAL_FIRST:</font><td>TILAHUN &nbsp;
CAL_ID:</font><td>tt1234 &nbsp;
CAL_FIRST:</font><td>TILAHUN &nbsp;
CAL_NE:</font><td>123-456-7890 &nbsp;

修剪脂肪我们删除“”,尾随“”并将冒号转换为等号。具有等号的最后一部分只是为了我们可以使用ConvertFrom-StringData以“key = value”的形式获取字符串输入,以便我们可以输出一个好的对象。

自我批评

我选择使用select-string因为我认为它可能更容易吞下,但我觉得使用PowerShell命名捕获的简单正则表达式可能会更好。

__从评论更新_

您提到您想要标题和评论中的变量数据。你忽略的部分是你想要它在变量中。从技术上讲,您只需将输出保存为变量,并将要查找的数据另存为参数。所以上面的代码将为第一行代替

$result = $html | select-string -Pattern 'CAL_(ID|FIRST|NE).*?&nbsp;' -AllMatches |

然后你可以像这样访问数据,因为它是一个数组。

$result.CAL_NE

注意:如果您只在数据中出现一次这样的条目,则效果最佳。最初我让他们多次出现,以便能够解释这一点。

如果确实希望将结果放在New-Variable发挥作用的变量中。

$html | select-string -Pattern 'CAL_(ID|FIRST|NE).*?&nbsp;' -AllMatches | 
        ForEach-Object{$_.Matches} |
        Select-Object -ExpandProperty Value |
        ForEach-Object{
            $text = $_ -replace [regex]::escape("</font><td>") -replace " &nbsp;"
            New-Variable -Name $text.split(":")[0] -Value $text.split(":")[1]
}

您可以访问$CAL_ID

PS C:\users\Cameron\Downloads> $CAL_ID
tt1234
相关问题