HTMLDocumentClass和getElementsByClassName不起作用

时间:2014-07-13 19:37:01

标签: powershell ihtmldocument2

去年我有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

这很有效,但这对我来说似乎是愚蠢的解决方案 谁知道我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

我将以前的顺序HTML解析转换为几个XPath查询(所有内容都保存在powershell脚本中)。这个解决方案更加优雅,HtmlAgilityPack真的很棒;)真的很荣幸能够使用这样的项目!

答案 1 :(得分:0)

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

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

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

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

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