【问题标题】:HTMLDocumentClass and getElementsByClassName not workingHTMLDocumentClass 和 getElementsByClassName 不起作用
【发布时间】:2014-07-13 19:37:00
【问题描述】:

去年我有一个 powershell (v3) 脚本来解析一个节日页面的 HTML(并为我的 Windows Phone 应用程序生成 XML)。

我在这里也是asking a question,它就像一个魅力。

但是当我今年运行脚本时,它不起作用。具体来说 - getElemntsByClassName 方法没有返回任何内容。我也在其他网页上尝试过这种方法,但没有成功。

这是我去年的代码,现在不起作用:

$tmpFile_bandInfo = "C:\band.txt"
Write-Host "Stahuji kapelu $($kap.Nazev) ..." -NoNewline    
Invoke-WebRequest http://www.colours.cz/ucinkujici/the-asteroids-galaxy-tour/ -OutFile $tmpFile_bandInfo
$content = gc $tmpFile_bandInfo -Encoding utf8 -raw
$ParsedHtml = New-Object -com "HTMLFILE"
$ParsedHtml.IHTMLDocument2_write($content)
$ParsedHtml.Close()
$bodyK = $ParsedHtml.body
$bodyK.getElementsByClassName("body four column page") # this returns NULL
$page = $page.item(0)
$aside = $page.getElementsByTagName("aside").item(0)
$img = $aside.getElementsByTagName("img").item(0)
$imgPath = $img.src

这是我用来解决此问题的代码:

$sec = $bodyK.getElementsByTagName("section") | ? ClassName -eq "body four column page"
# but now I have no innerHTML, only the lonely tag SECTION
# so I am walking through siblings
$img = $sec.nextSibling.nextSibling.nextSibling.getElementsByTagName("img").item(0)
$imgPath = $img.src

这行得通,但这对我来说似乎很愚蠢。
有谁知道我做错了什么?

【问题讨论】:

  • 我认为这是一个错误。
  • 您在 Internet Explorer 上安装了哪个版本? Inovoke-WebRequest 使用 IE 引擎解析 HTML,直到 v9,IE 才支持 getElementsByClassName
  • 我在 Windows 8 上安装了 IE10。
  • @AnsgarWiechers 奇怪的是它在一年前就起作用了......

标签: powershell ihtmldocument2


【解决方案1】:

我实际上通过放弃 Invoke-WebRequest cmdlet 和采用HtmlAgilityPack 解决了这个问题。

我将以前的顺序 HTML 解析转换为几个 XPath 查询(所有内容都保留在 powershell 脚本中)。这个解决方案更加优雅,而且 HtmlAgilityPack 是真正的坏蛋 ;) 与这样的项目合作真的很荣幸!

【讨论】:

    【解决方案2】:

    问题不是错误,而是您看到 NULL 的返回是因为它实际上是对 DOM 模型的代理 HTMLFile COM 调用的引用。

    您可以通过将其装箱到数组 @() 中来强制它操作并返回底层字符串:

    @($mybody.getElementsByClassName("body four column page")).textContent
    

    如果您对其执行 Select-Object,这也会自动发生,它会通过 COM 解开它并将其作为字符串返回

    $mybody.getElementsByClassName("body four column page") | Select-Object -Property TextContent
    

    【讨论】:

      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多