编码Invoke-Webrequest的响应

时间:2013-07-17 17:04:47

标签: powershell

对某些带有非英文字符的网页使用cmdlet InvokeWebRequest时,我认为无法定义响应/网页内容的编码。

我在http://colours.cz/ucinkujici/上使用简单的GET,这些艺术家的名字已损坏。您可以使用以下简单的行尝试:

Invoke-WebRequest http://colours.cz/ucinkujici

这是由cmdlet的设计引起的吗? 我能以某种方式指定编码吗? 是否有任何解决方法可以正确解析响应?

2 个答案:

答案 0 :(得分:7)

在我看来你是对的:/

以下是获取内容的一种方法,但是您没有处理HtmlWebResponseObject

Invoke-WebRequest http://colours.cz/ucinkujici -outfile .\colours.cz.txt
$content = gc .\colours.cz.txt -Encoding utf8 -raw

这会让你同样远:

[net.httpwebrequest]$httpwebrequest = [net.webrequest]::create('http://colours.cz/ucinkujici/')
[net.httpWebResponse]$httpwebresponse = $httpwebrequest.getResponse()
$reader = new-object IO.StreamReader($httpwebresponse.getResponseStream())
$content = $reader.ReadToEnd()
$reader.Close()

如果你真的想要这样的HtmlWebResponseObject,这是一种方法来自ParsedHtml的内容或多或少“可读”Invoke-WebRequest$bad$better):

Invoke-WebRequest http://colours.cz/ucinkujici -outvariable htmlwebresponse
$bad = $htmlwebresponse.parsedhtml.title
$better = [text.encoding]::utf8.getstring([text.encoding]::default.GetBytes($bad))
$bad = $htmlwebresponse.links[7].outerhtml
$better = [text.encoding]::utf8.getstring([text.encoding]::default.GetBytes($bad))

更新:以下是对此的新观点,因为您知道要使用ParsedHtml
获得内容后,即可:

$ParsedHtml = New-Object -com "HTMLFILE"
$ParsedHtml.IHTMLDocument2_write($content)
$ParsedHtml.Close()

Etvoilà:]例如$ParsedHtml.title现在显示正确,猜测其余的也可以......

答案 1 :(得分:0)

您不需要文件的解决方法,只需正确使用响应对象:

$response = Invoke-WebRequest http://colours.cz/ucinkujici

$encodedString = $response.Content

我花了一些时间才弄清楚,因为很多人都在抱怨 Invoke-WebRequest 中的错误。