在对某些具有非英语字符的 Web 使用 cmdlet InvokeWebRequest 时,我看不到定义响应/页面内容的编码的方法。
我在http://colours.cz/ucinkujici/上使用了简单的 GET ,这些艺术家的名字被破坏了。你可以用这个简单的行来试试:
Invoke-WebRequest http://colours.cz/ucinkujici
这是由 cmdlet 的设计引起的吗?我可以以某种方式指定编码吗?是否有任何解决方法来获得正确解析的响应?
在对某些具有非英语字符的 Web 使用 cmdlet InvokeWebRequest 时,我看不到定义响应/页面内容的编码的方法。
我在http://colours.cz/ucinkujici/上使用了简单的 GET ,这些艺术家的名字被破坏了。你可以用这个简单的行来试试:
Invoke-WebRequest http://colours.cz/ucinkujici
这是由 cmdlet 的设计引起的吗?我可以以某种方式指定编码吗?是否有任何解决方法来获得正确解析的响应?
在我看来你是对的:/
这是获取正确内容的一种方法,首先将响应保存到文件中,然后将其读取到具有正确编码的变量中。但是,您不是在处理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()
如果您真的想要这样的,这里有一种方法可以从或多或少“可读”的(vs. )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
.
一旦你有了你的内容(见第一个 2 行代码段,其中 1)保存对文件的响应,然后 2)用正确的编码“读取”文件内容),你可以这样做:
$ParsedHtml = New-Object -com "HTMLFILE"
$ParsedHtml.IHTMLDocument2_write($content)
$ParsedHtml.Close()
Et voilà :] 例如$ParsedHtml.title
,现在显示正确,猜测其余部分也可以......</p>
您不需要文件的解决方法,只需正确使用响应对象:
$response = Invoke-WebRequest http://colours.cz/ucinkujici
$encodedString = $response.Content
我花了一些时间才弄清楚,因为很多人都在抱怨 Invoke-WebRequest 中的错误。