0

我需要从具有 win-1251 代码页的页面获取数据。

$SiteAdress = "http://www.gisinfo.ru/download/download.htm"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
echo $HttpContent

它向我展示了:

> StatusCode        : 200 StatusDescription : OK Content           :
> <!DOCTYPE html>
>                     <html><!-- #BeginTemplate "/Templates/panorama.dwt" --><!-- DW6 -->
>                     <head>
>                     <!-- #BeginEditable "doctitle" --> 
>                     <title>ÃÈÑ ÏÀÍÎÐÀÌÀ - Ñêà÷àòü ïðîãðàììû</title>
>                     <meta name="keywords" con... RawContent        : HTTP/1.1 200 OK
>                     Transfer-Encoding: chunked
>                     Connection: keep-alive
>                     Keep-Alive: timeout=20
>                     Content-Type: text/html
>                     Date: Fri, 16 Oct 2015 12:40:45 GMT
>                     Server: nginx/1.5.7
>                     X-Powered-By: PHP/5.2.17...

标题是西里尔文。我试过下面的变种,但结果是一样的。

$HttpContent = Invoke-WebRequest -URI $SiteAdress -ContentType "text/html; charset=windows-1251"
4

2 回答 2

0

-ContentType参数Invoke-WebRequest设置请求的内容类型,而不是响应。由于您没有在请求中发送任何内容,因此在这里完全无关紧要。

我没有找到一种简单的方法来为响应执行特定的编码。由于编码仅在 HTML 中指定,而不是在响应标头中指定,因此我担心您在这里无能为力,因为 Invoke-WebRequest 不够聪明,无法自行解决。

但是,您可以转换您阅读的文本:

filter Convert-Encoding {
  $1251 = [System.Text.Encoding]::GetEncoding(1251)
  $1251.GetString([System.Text.Encoding]::Default.GetBytes($_))
}

$HttpContent.Content | Convert-Encoding

然后将产生正确的西里尔文字。

<!DOCTYPE html>
<html><!-- #BeginTemplate "/Templates/panorama.dwt" --><!-- DW6 -->
<head>
<!-- #BeginEditable "doctitle" -->
<title>ГИС ПАНОРАМА - Скачать программы</title>
<meta name="keywords" content="ГИС, карта, геодезия, картография, фотограмметрия, топография, электронная карта, классификатор, трехмерное моделирование, модель местности, карта Москвы, Ногинск, кадастр, межевое дело, Гаусс, эллипсоид Красовского, 1942, оротофотоснимок, WGS, растр, план, схема, бланковка, фотодокумент, земля, право, документация, map, sit, mtw, mtr, rsw, rsc, s57, s52, gis, 2003, 2004, Tool, Kit">
<meta name="description" content="Новые версии ГИС Карта 2000, GIS ToolKit , СУРЗ Земля и Право, документации, библиотек и примеров электронных карт">
<!-- #EndEditable -->

无论如何,无论您如何解决它,您都需要事先知道确切的编码。不过,您可以尝试在 HTML 源代码中找到它:

[Regex]::Matches($HttpContent.Content, 'text/html;\s*charset=(?<encoding>[1-9a-z-]+)')

[System.Text.Encoding]::GetEncodingwindows-1251至少可以处理类似的字符串。

于 2015-10-16T13:53:07.723 回答
0

我的工作变体:

$client = New-Object System.Net.WebClient
$url = "http://www.gisinfo.ru/download/download.htm"
$results = [System.Text.Encoding]::GetEncoding('windows-1251').GetString([Byte[]]$client.DownloadData($url))

感谢乔伊的帮助

于 2015-10-19T11:39:04.253 回答