【问题标题】:Encoding of the response of the Invoke-WebrequestInvoke-Webrequest 响应的编码
【发布时间】:2013-07-17 17:04:46
【问题描述】:

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

我在http://colours.cz/ucinkujici/ 上使用了简单的 GET,但这些艺术家的名字已损坏。你可以用这条简单的线试试:

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

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

【问题讨论】:

  • 您是否在 powershell.exe 控制台中显示结果?您的字体可能不支持这些字符。
  • 我正在使用 powershell ISE v3。我想说这不是问题,因为我在 powershell ISE 或控制台中的语言没有其他问题......

标签: powershell


【解决方案1】:

在我看来你是对的:/

这是获取正确内容的一种方法,首先将响应保存到文件中,然后将其读取到具有正确编码的变量中。但是,您处理的不是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合作。
一旦你有了你的内容(见前 2 行 sn-p 1)保存对文件的响应,然后 2)用正确的编码“读取”文件内容),你可以这样做:

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

Et voilà :] 例如$ParsedHtml.title 现在显示正确,猜测其余部分也可以……

【讨论】:

  • 我尝试了第一个示例并且它有效。但坏消息是,我已经针对 HtmlWebResponseObject 的 parsedHTML 属性编写了所有代码。所以我尝试了第三个例子(这会拯救我)但不幸的是它没有t work for me. It gives me Sigur RA3s (in $better) from original Sigur Rós (in $bad`)。
  • 我使用了您的 Update 部分,它适用于我的旧代码。非常感谢,正是我需要的。
【解决方案2】:

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

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

$encodedString = $response.Content

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2021-03-30
    • 2014-08-07
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    相关资源
    最近更新 更多