【问题标题】:Windows PowerShell parse HTML local fileWindows PowerShell 解析 HTML 本地文件
【发布时间】:2015-02-14 03:28:42
【问题描述】:

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

我正在使用从 Mozilla Firefox Developer Edition 下载 HTML 文件(我正在下载索引文件)本地的脚本,我想解析它以获取 select 元素内的 options 元素的值,其中包含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 开发语言环境。

问候, 哦

【问题讨论】:

    标签: html regex powershell xpath


    【解决方案1】:

    我没有看到要修复的代码示例,所以我会制作一个。

    如果是远程 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】:

      如果您运行的是 PS 3.0 或更高版本,您可以利用 Invoke-WebRequest 来处理网络上存在的页面。如果您对本地文件进行操作,it can be a bit finicky。

      Invoke-WebRequest 返回一个HtmlWebResponseObject,其属性名为ParsedHtml。该对象有一个名为 getElementById 的方法,我们可以使用它,因为我们知道您的选择标签上的 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 对象上的任何其他属性一样使用国家名称和代码。

      至于网络端点,听起来您可以修改此脚本以指向您从中提取此 HTML 的原始 Mozilla 页面?

      【讨论】:

        【解决方案3】:

        对于大多数 HTML,另一种选择是将文件加载为 XML 并以这种方式使用它。在我的 powershell tumbler 文件下载器中查看示例:

        https://github.com/jefflomax/powershell-download-tumbler-images

        【讨论】:

        • 这假定内容格式正确,而 HTML 通常不是。
        猜你喜欢
        • 2015-07-15
        • 2015-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2018-10-10
        相关资源
        最近更新 更多