HTMLDocumentClass和getElementsByClassName不起作用



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

我也在这里问了一个关于它的问题,它奏效了。

但是当我今年运行脚本时,它不工作。具体来说- 方法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

这是可行的,但对我来说这似乎是愚蠢的解决方案。
有人知道我哪里做错了吗?

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

我将以前的顺序HTML解析转换为几个XPath查询(所有内容都保留在powershell脚本中)。这个解决方案要优雅得多,而且htmllagilitypack真的很厉害。能参与这样的项目是我的荣幸!

这个问题不是一个bug,而是你看到NULL的返回,因为它实际上是对代理HTMLFile COM调用DOM模型的引用。

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

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

如果你对它执行选择对象,也会自动发生它会通过COM展开并以字符串形式返回

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

最新更新