使用PowerShell在网页中查找特定句子

Blu*_*luz 6 string powershell

我需要使用powershell通过whois解析IP地址.我的公司过滤端口43和WHOIS查询,因此我必须使用的解决方法是让powershell使用https://who.is等网站,读取http流并查找与IP地址匹配的组织名称.

到目前为止,我已经设法将网页读入PowerShell(例如,在yahoo.com上使用WHOIS),这是https://who.is/whois-ip/ip-address/206.190.36.45

所以这是我的片段:

$url=Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45
Run Code Online (Sandbox Code Playgroud)

现在,如果我这样做:

$url.gettype()
IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    HtmlWebResponseObject                    Microsoft.PowerShell.Commands.WebResponseObject
Run Code Online (Sandbox Code Playgroud)

我看到这个对象有几个属性:

Name              MemberType Definition
----              ---------- ----------
Equals            Method     bool Equals(System.Object obj)
GetHashCode       Method     int GetHashCode()
GetType           Method     type GetType()
ToString          Method     string ToString()
AllElements       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection AllElements {get;}
BaseResponse      Property   System.Net.WebResponse BaseResponse {get;set;}
Content           Property   string Content {get;}
Forms             Property   Microsoft.PowerShell.Commands.FormObjectCollection Forms {get;}
Headers           Property   System.Collections.Generic.Dictionary[string,string] Headers {get;}
Images            Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Images {get;}
InputFields       Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection InputFields {get;}
Links             Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Links {get;}
ParsedHtml        Property   mshtml.IHTMLDocument2 ParsedHtml {get;}
RawContent        Property   string RawContent {get;}
RawContentLength  Property   long RawContentLength {get;}
RawContentStream  Property   System.IO.MemoryStream RawContentStream {get;}
Scripts           Property   Microsoft.PowerShell.Commands.WebCmdletElementCollection Scripts {get;}
StatusCode        Property   int StatusCode {get;}
StatusDescription Property   string StatusDescription {get;}
Run Code Online (Sandbox Code Playgroud)

但每次我尝试像这样的命令

$url.ToString() | select-string "OrgName"
Run Code Online (Sandbox Code Playgroud)

Powershell返回整个HTML代码,因为它将文本字符串解释为一个整体.我找到了一个解决方法,将输出转储到一个文件中,然后通过一个对象读取文件(所以每一行都是一个数组的元素),但是我要检查数百个IP,这样才不是最佳的创建文件.

我想知道如何阅读网页https://who.is/whois-ip/ip-address/206.190.36.45的内容并获得以下内容:OrgName:Yahoo! 广播服务公司

而且只是那条线.

非常感谢您的帮助!:)

Mat*_*att 12

有很多可能更好的方法来解析这个问题,但是你在当前的逻辑上走在正确的轨道上.

$web = Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45
$web.tostring() -split "[`r`n]" | select-string "OrgName"
Run Code Online (Sandbox Code Playgroud)

Select-String因为它之前是一条长串而正在返回比赛.使用-split我们可以分解它以获得您期望的回报.

OrgName:        Yahoo! Broadcast Services, Inc.
Run Code Online (Sandbox Code Playgroud)

之后的一些字符串操作将获得更清晰的答案.同样,有很多方法可以解决这个问题

(($web.tostring() -split "[`r`n]" | select-string "OrgName" | Select -First 1) -split ":")[1].Trim()
Run Code Online (Sandbox Code Playgroud)

我曾经Select -First 1作为select-string可以返回多个对象.它只会确保我们在操作字符串时使用1.字符串只是在冒号上拆分并修剪以删除留下的空格.

由于您要提取HTML数据,我们还可以浏览这些属性以获得更具体的结果.这样做的目的是得到1RedOne的回答

$web = Invoke-WebRequest https://who.is/whois-ip/ip-address/206.190.36.45
$data = $web.AllElements | Where{$_.TagName -eq "Pre"} | Select-Object -Expand InnerText
$whois = ($data -split "`r`n`r`n" | select -index 1) -replace ":\s","=" | ConvertFrom-StringData
$whois.OrgName
Run Code Online (Sandbox Code Playgroud)

PRE在此示例中,所有数据都存储在标记的文本中.我所做的是将数据分成它们的部分(部分用空行分隔它们.我寻找连续的换行符).第二组数据包含组织名称.将其存储在变量中并将其OrgName作为属性拉出:$whois.OrgName.这是什么$whois样的

Name                           Value                                                                                                                         
----                           -----                                                                                                                         
Updated                        2013-04-02                                                                                                                    
City                           Sunnyvale                                                                                                                     
Address                        701 First Ave                                                                                                                 
OrgName                        Yahoo! Broadcast Services, Inc.                                                                                               
StateProv                      CA                                                                                                                            
Country                        US                                                                                                                            
Ref                            http://whois.arin.net/rest/org/YAHO                                                                                           
PostalCode                     94089                                                                                                                         
RegDate                        1999-11-17                                                                                                                    
OrgId                          YAHO
Run Code Online (Sandbox Code Playgroud)

如果您愿意处理这些哈希表,也可以将该哈希表制作成自定义对象.

[pscustomobject]$whois

Updated    : 2017-01-28
City       : Sunnyvale
Address    : 701 First Ave
OrgName    : Yahoo! Broadcast Services, Inc.
StateProv  : CA
Country    : US
Ref        : https://whois.arin.net/rest/org/YAHO
PostalCode : 94089
RegDate    : 1999-11-17
OrgId      : YAHO
Run Code Online (Sandbox Code Playgroud)


小智 9

它很简单,使用whois app这是微软把应用程序在System32或windir和powershell使用whois命令然后get-string得到"orgname"这样

PS C:\> whois.exe -v 206.190.36.45 | Select-String "Registrant Organization"

Registrant Organization: Yahoo! Inc.
Run Code Online (Sandbox Code Playgroud)

我建议你这个应用程序,因为有更多的工作信息


Fox*_*loy 5

在这里,执行此操作的方法实际上是执行Invoke-WebRequest. 如果我们查看从 Invoke-WebRequest 获取的对象的一些属性,我们可以看到 PowerShell 已经为我们解析了一些 HTML 和文本。

我们所要做的就是挑选一些我们想要使用的值。例如,看看这个ParsedText领域,我们会看到这些结果。

html文本

这些字段从大约第 30 行左右开始。在我解决这个问题的方法中,我们知道我们会在页面中间找到这样的好数据,所以如果我们可以从这些行中抓取值,我们就可以开始处理数据了。完成这第一部分的代码是这样的:

$url = "https://who.is/whois-ip/ip-address/$ipaddress"
      $Results = Invoke-WebRequest $url 

      $ParsedResults = $Results.ParsedHtml.body.outerText.Split("`n")[30..50]
Run Code Online (Sandbox Code Playgroud)

现在,PowerShell 拥有许多非常强大的命令来导入和转换数据为各种格式。例如,如果我们只能用等号 '=' 替换 ':' 冒号字符,我们可以将整个混乱发送给ConverFrom-StringData并拥有丰富的 PowerShell 对象来使用。事实证明,我们可以使用通用-Replace运算符轻松做到这一点,就像这样

$Results.ParsedHtml.body.outerText.Split("`n")[30..50] -replace ":","="
Run Code Online (Sandbox Code Playgroud)

我想你将来可能想再做一次,所以我把整个事情变成了一个简单的五行函数。把它扔进你的 $Profile 并享受。

所以最终的结果是这样的:

Function Get-WhoIsData {
  param($ipaddress='206.190.36.45')
  $url = "https://who.is/whois-ip/ip-address/$ipaddress"
  $Results = Invoke-WebRequest $url 

  $ParsedResults = $Results.ParsedHtml.body.outerText.Split("`n")[30..50] -replace ":","=" | ConvertFrom-StringData

  $ParsedResults }
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它:

PS C:\windows\system32> Get-WhoIsData -ipaddress 206.190.36.45
   Name                           Value                                                                                                                                            
----                           -----                                                                                                                                            
NetRange                       206.190.32.0 - 206.190.63.255                                                                                                                    
CIDR                           206.190.32.0/19                                                                                                                                  
NetName                        NETBLK1-YAHOOBS                                                                                                                                  
NetHandle                      NET-206-190-32-0-1                                                                                                                               
Parent                         NET206 (NET-206-0-0-0-0)                                                                                                                         
NetType                        Direct Allocation                                                                                                                                
OriginAS                                                                                                                                                                        
Organization                   Yahoo! Broadcast Services, Inc. (YAHO)                                                                                                           
RegDate                        1995-12-15                                                                                                                                       
Updated                        2012-03-02                                                                                                                                       
Ref                            http=//whois.arin.net/rest/net/NET-206-190-32-0-1                                                                                                
OrgName                        Yahoo! Broadcast Services, Inc.                                                                                                                  
OrgId                          YAHO                                                                                                                                             
Address                        701 First Ave                                                                                                                                    
City                           Sunnyvale                                                                                                                                        
StateProv                      CA                                                                                                                                               
PostalCode                     94089     
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用普通的 Select-Object 或 Where-Object 命令选择您想要的任何属性。例如,要仅提取 orgName 属性,您可以使用以下命令:

(Get-WhoIsData).OrgName
>Yahoo! Broadcast Services, Inc.
Run Code Online (Sandbox Code Playgroud)