对某些带有非英文字符的网页使用cmdlet InvokeWebRequest时,我认为无法定义响应/网页内容的编码。
我在http://colours.cz/ucinkujici/上使用简单的GET,这些艺术家的名字已损坏。您可以使用以下简单的行尝试:
Invoke-WebRequest http://colours.cz/ucinkujici
这是由cmdlet的设计引起的吗? 我能以某种方式指定编码吗? 是否有任何解决方法可以正确解析响应?
答案 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 中的错误。