ウィキペディアから空港情報を集めています。空港名で非 ASCII 文字を保持したい。
コードが Z で始まる空港は、Web ブラウザーで次のように表示されます。
空港 DBE は「ドルニ ベネソフ空港」と呼ばれます。空港 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 オブジェクトのコレクション (テーブル内のデータ行ごとに 1 つずつ) が含まれています。
このコマンドは、スクレーパーが非 ASCII 文字を含む名前をマングルすることを示しています。
$Airports |
? { $_.AirportName -like '*[?]*' } |
Format-Table
空港名に疑問符を含めないでください。このコマンドは出力を生成しないと思います。
代わりに、Web ブラウザーに非 ASCII 文字が表示される名前に 2 つの疑問符が付いたオブジェクトがいくつかあります。
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
それは確かに文字エンコーディングの問題です。ウィキペディアはUTF-8を生成しますが、PowerShell がWindows-1252またはその他のシングルバイト文字セットとしてデコードしているようです。
UTF-8 を指定できるInvoke-WebRequestコマンドレットまたはSelect-Xmlコマンドレットのスイッチが見つかりません。
この問題を解決する簡潔な方法はありますか? どんな方法でもかまいませんが、欠けている単純なものがあると思います。