我想获得一个网页的内容,当我使用
$web = Invoke-RestMethod -Uri "https://inkscape.org/"
我将得到内容但是当我使用
$web = Invoke-WebRequest -Uri "https://inkscape.org/"
我什么都得不到,为什么会这样??到底有什么区别?
简单地说,对于明文或HTML响应体,(旧的)Invoke-WebRequest
cmdlet与Invoke-RestMethod
cmdlet之间的关系相对于默认的GET
方法如下:
# -UseBasicParsing is only needed in *Windows PowerShell*.
(Invoke-WebRequest -UseBasicParsing -Uri "https://inkscape.org/").Content
等于:
Invoke-RestMethod -Uri "https://inkscape.org/"
:
Invoke-WebRequest
返回一个响应对象,其.Content
属性包含响应的主体,总是作为文本(除非您使用-OutFile
将原始主体保存到文件)。- HTML响应的身体,Windows PowerShell还试图解析HTML文本到HTML DOM,浮出水面通过
.ParsedHTML
属性,使用过时的Internet Explorer。-UseBasicParsing
抑制了这一点。这个开关在PowerShell (Core) 7+中没有作用,它基本上不支持解析HTML,需要第三方解决方案(参见此示例答案)或-仅在Windows上-基于com的解决方案(参见此答案)。
- HTML响应的身体,Windows PowerShell还试图解析HTML文本到HTML DOM,浮出水面通过
Invoke-RestMethod
直接返回响应正文(仅限)。此外,如果目标站点指示返回XML或JSON数据,
Invoke-RestMethod
不会将正文作为文本返回,而是自动将其解析为[xml]
实例/[System.Xml.XmlElement]
实例(用于RSS/Atom提要)或[pscustomobject]
图形(可以说,ConvertFrom-Json
是内置在中的)。即使没有已知的响应数据格式,PowerShell也会尝试解析响应体,首先是XML,然后是JSON;如果所有尝试都失败,则返回纯文本(
[string]
实例)。即使对于
text/html
响应,也会尝试将它们解析为XML。也就是说,如果页面恰好是有效的XML(这在现在很少见),您将得到一个[xml]
实例;例如,非常简单的HTML5页面https://httpbin.org/html恰好是有效的XML(不包括<!DOCTYPE html>
声明),而HTML5页面通常是而不是。因此,(Invoke-RestMethod https://httpbin.org/html).GetType().FullName
返回System.Xml.XmlDocument
,即[xml]
实例。