Веб-запрос powershell invoke-webrequest с кодовой страницей win 1251
Мне нужно получить данные со страницы с кодовой страницей 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"
2 ответа
-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
, по крайней мере.
Мой рабочий вариант:
$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))
Спасибо Джои за помощь