powershell invoke-webrequest,代码页获胜1251

时间:2015-10-16 13:00:05

标签: powershell webrequest cyrillic windows-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 个答案:

答案 0 :(得分:0)

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

我没有找到一种简单的方法来强制执行特定的响应编码。由于编码只在HTML中指定,而不是在响应标题中指定,所以我很担心,因为Invoke-WebRequest不够智能,无法自行解决。< / p>

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

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之类的字符串。

答案 1 :(得分: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的帮助

相关问题