2015-10-16 7 views
0

Мне нужно получить данные со страницы с кодовой страницей win-1251.powershell invoke-webrequest с кодовой страницей 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" 

ответ

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]::GetEncoding может справиться со строкой как windows-1251, по крайней мере.

+0

Спасибо за ответ =) – user3798175

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)) 

Спасибо Joey за помощью