我正在从维基百科收集机场信息。我想保留机场名称中的非 ASCII 字符。
在网络浏览器中,代码以 Z 开头的机场如下所示:
机场 DBE 被称为“Dolní Benesov机场”。ZBK 机场被称为“ Ž abljak 机场”。我希望输出中的值相同。
我正在用这样的函数抓取数据:
function Get-Airports ($Uri) {
Invoke-WebRequest -Uri $Uri -UseBasicParsing |
Select-Xml -XPath '//table/tr[td]' |
% {
$Kids = $_.Node.ChildNodes
[PSCustomObject] @{
Iata = $Kids[0].InnerText
Icao = $Kids[1].InnerText
AirportName = $Kids[2].InnerText
LocationServed = $Kids[3].InnerText
}
}
}
该函数获取给定的 URI,将 HTML 响应隐式转换为 XML,使用 XPath 提取表数据行,然后将每个列值映射到新 PowerShell 对象的属性。
要获取以 Z 开头的所有机场,我使用如下命令:
$Airports = Get-Airports 'http://en.wikipedia.org/wiki/List_of_airports_by_IATA_code:_Z'
该$Airports
变量包含一组新的 PowerShell 对象,表中的每个数据行都有一个对象。
此命令显示刮板会破坏包含非 ASCII 字符的名称:
$Airports |
? { $_.AirportName -like '*[?]*' } |
Format-Table
任何机场名称都不应包含问号。我希望这个命令不会产生任何输出。
相反,有几个对象的名称中有两个问号,其中一个非 ASCII 字符会出现在 Web 浏览器中:
Iata Icao AirportName LocationServed
---- ---- ----------- --------------
ZBE LKZA Doln?? Benesov Airport Z??b??eh, Czech Republic
ZBK ??abljak Airport ??abljak, Montenegro
ZBM CZBM Bromont (Roland D??sourdy) Airport Bromont, Quebec, Canada
ZLG La G??era Airport La G??era, Western Sahara
ZLT La Tabati??re Airport (TC: CTU5) La Tabati??re, Quebec, Canada
ZOS SCJO Ca??al Bajo Carlos Hott Siebert Airport Osorno, Chile
ZPC SCPC Puc??n Airport Puc??n, Chile
ZQW EDRZ Zweibr??cken Airport Zweibr??cken, Germany
ZTB T??te-??-la-Baleine Airport (TC: CTB6) T??te-??-la-Baleine, Quebec, Canada
这肯定是字符编码问题。Wikipedia 生成UTF-8,但看起来 PowerShell 将其解码为Windows-1252或其他单字节字符集。
我在Invoke-WebRequest cmdlet 或Select-Xml cmdlet上找不到可以让我指定 UTF-8 的开关。
有没有一种简洁的方法来解决这个问题?任何方式都可以,但我认为我缺少一件简单的事情。