Windows PowerShell解析HTML本地文件

时间:2014-12-15 22:13:51

标签: html regex powershell xpath

我想使用PowerShell从HTML文件构建一个数组。

我正在使用从Mozilla Firefox Developer Edition(我正在下载索引文件)本地下载HTML文件的脚本,我想解析它以获取select元素中包含的选项元素的值id设置为id_country。

我被建议使用XPath,但我无法解决如何解析文件并从结果中构建数组。也许使用正则表达式可能是一种解决方法。

HTML文件在这里:

http://pastebin.com/b8cShFLA

我想在这里选择元素的所有值:

<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

3 个答案:

答案 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