5

在对某些具有非英语字符的 Web 使用 cmdlet InvokeWebRequest 时,我看不到定义响应/页面内容的编码的方法。

我在http://colours.cz/ucinkujici/上使用了简单的 GET ,这些艺术家的名字被破坏了。你可以用这个简单的行来试试:

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

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

4

2 回答 2

8

在我看来你是对的:/

这是获取正确内容的一种方法,首先将响应保存到文件中,然后将其读取到具有正确编码的变量中。但是,您不是在处理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中获取例如东西:ParsedHtmlInvoke-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>

于 2013-07-17T23:57:16.503 回答
0

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

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

$encodedString = $response.Content

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

于 2021-03-22T16:31:52.247 回答