anc*_*hnk 3 html regex powershell xpath
我想使用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>
Run Code Online (Sandbox Code Playgroud)
...
我是PowerShell的新手,这就是为什么我真的不知道我可以使用的不同解决方案.我需要一些非常快的东西,因为它是包安装程序的一部分.
基本上,脚本将尝试查看是否存在与用户计算机的语言环境匹配的安装程序,如果不是,则默认为英语,这就是为什么我需要从该列表中获取值以检查firefox dev可用语言环境的原因.
问候,O
如果您运行的是PS 3.0或更高版本,则可以利用Invoke-WebRequest来获取Web上存在的页面.如果您对本地文件进行操作,则可能有点挑剔.
调用-的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
Run Code Online (Sandbox Code Playgroud)
输出:
text value
---- -----
Afghanistan af
Albania al
Algeria dz
American Samoa as
Andorra ad
... ...
Run Code Online (Sandbox Code Playgroud)
然后,您可以像使用powershell对象上的任何其他属性一样使用国家/地区名称和代码.
对于Web端点,听起来您可以修改此脚本以指向您从中提取此HTML的原始Mozilla页面?
我没有看到要修复的代码示例,所以我会创建一个.
如果它是一个远程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
Run Code Online (Sandbox Code Playgroud)
输出继电器:
Name Value
---- -----
rw Rwanda
tv Tuvalu
to Tonga
pn Pitcairn
bh Bahrain
lc Saint Lucia
Run Code Online (Sandbox Code Playgroud)