我想使用PowerShell从HTML文件构建一个数组。
我正在使用从Mozilla Firefox Developer Edition(我正在下载索引文件)本地下载HTML文件的脚本,我想解析它以获取select元素中包含的选项元素的值id设置为id_country。
我被建议使用XPath,但我无法解决如何解析文件并从结果中构建数组。也许使用正则表达式可能是一种解决方法。
HTML文件在这里:
我想在这里选择元素的所有值:
<select aria-required="true" id="id_country" name="country" required="required">
<option value="af">Afghanistan</option>
<option value="al">Albania</option>
<option value="dz">Algeria</option>
<option value="as">American Samoa</option>
<option value="ad">Andorra</option>
...
我对PowerShell很陌生,这就是为什么我真的不知道我可以使用的不同解决方案。我需要一些非常快的东西,因为它是软件包安装程序的一部分。
基本上,脚本会尝试查看是否有与用户计算机的区域设置匹配的安装程序,如果没有,则默认为英语,这就是我需要从该列表中获取值的原因为了检查firefox dev可用的语言环境。
此致 0
答案 0 :(得分:5)
如果您运行的是PS 3.0或更高版本,则可以利用Invoke-WebRequest获取网络上存在的网页。如果您对本地文件it can be a bit finicky进行操作。
Invoke-WebRequest返回一个HtmlWebResponseObject,其中包含一个名为ParsedHtml的属性。这个对象有一个名为getElementById的方法,我们可以使用它,因为我们知道select标签上的id“id_country”。从那里,迭代选项标签并过滤以返回我们想要的属性......“文本”和“值”是一件简单的事情。
以下示例输出包含国家/地区名称和国家/地区代码的自定义对象:
代码:
# I'm using your raw pastebin endpoint for this example
$result = Invoke-WebRequest "http://pastebin.com/raw.php?i=b8cShFLA"
# Only return specific properties from the elements you're looking for
$countries = $result.ParsedHtml.getElementById("id_country") |
Where tagName -eq "option" |
Select -Property Text, Value
# Country name and code are stored to this variable
$countries
输出:
text value
---- -----
Afghanistan af
Albania al
Algeria dz
American Samoa as
Andorra ad
... ...
然后,您可以像使用powershell对象上的任何其他属性一样使用国家/地区名称和代码。
对于Web端点,听起来您可以修改此脚本以指向您从中提取此HTML的原始Mozilla页面?
答案 1 :(得分:5)
我没有看到要修复的代码示例,所以我会制作一个。
如果是远程html,我会使用Invoke-WebRequest
,但这对本地文件效果不佳。
为解析本地文件,我建议使用HTML Agility Pack来解析HTML文件,然后使用xPath获取您正在寻找的选项。实施例
Add-Type -Path .\HTMLAgilityPack\HtmlAgilityPack.dll
$url = (get-item .\b8cShFLA.html).FullName
$doc = New-Object HtmlAgilityPack.HtmlDocument
$doc.LoadHtml((get-content $url))
#Create hashtable to store data in
$langs = @{}
$doc.DocumentNode.SelectSingleNode("//select[@name='country']").SelectNodes("option") | ForEach-Object {
$short = $_.Attributes[0].Value
$long = $_.NextSibling.InnerText
#Store data in hashtable
$langs[$short] = $long
}
$langs
输出继电器:
Name Value
---- -----
rw Rwanda
tv Tuvalu
to Tonga
pn Pitcairn
bh Bahrain
lc Saint Lucia
答案 2 :(得分:0)
对于大多数HTML,另一种选择是将文件作为XML加载并以这种方式使用它。请参阅我的powershell tumbler文件下载器中的示例:
https://github.com/jefflomax/powershell-download-tumbler-images