解析HTML,多个类

时间:2018-11-09 08:54:04

标签: html powershell

我想创建一个PowerShell脚本来从网站获取信息。 我正在尝试查找以下HTML标记的网站的首次出现:

<div class="dDoNo gsrt"><span data-dobid="hdw">Text I want to find</span></div>

我正在使用以下PowerShell代码,但未成功,无法输出:

$WebResponse = Invoke-WebRequest "https://www.google.co.in/search?hl=en&q=define+Text"
($WebResponse.ParsedHtml.GetElementsByTagName(‘div’) | Where {
    $_.ClassName -eq ‘dDoNo’
}).InnerText

更准确地说: 我正在尝试通过从Google抓取HTML来获取单词的定义,并将此类作为基础: googleDictionaryAPI class

2 个答案:

答案 0 :(得分:0)

一方面,您需要在GetElementsByTagName()的{​​{1}}子节点上调用DocumentElement,否则根本无法获得任何结果。另外,类字符串“ dDoNo gsrt”不等于“ dDoNo”,因此您需要测试值是否包含类名称“ dDoNo”。

更改

ParsedHtml

($WebResponse.ParsedHtml.GetElementsByTagName(‘div’) | Where {
    $_.ClassName -eq ‘dDoNo’
}).InnerText

并且代码应该执行您想要的操作。

请注意,不建议在代码中使用印刷引号(($WebResponse.ParsedHtml.DocumentElement.GetElementsByTagName('div') | Where { $_.ClassName -match '\bdDoNo\b' }).InnerText )。当它们大部分时间都在工作时,我确实遇到了它们以有趣的方式导致事物崩溃的情况。改用普通引号()。

答案 1 :(得分:0)

感谢@Ansgar向我指出正确的解决方案。

主要问题是我从Invoke-WebRequest获得的响应与我从浏览器获得的响应不同。解决方案是在调用请求时定义UserAgent:

$WebResponse = (Invoke-WebRequest -Uri "https://www.google.co.in/search?hl=en&q=define+Text" -UserAgent "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36")

($WebResponse.ParsedHtml.DocumentElement.GetElementsByTagName('div') | Where {
    $_.ClassName -match '\bdDoNo\b'
}).InnerText