3

我正在遍历 URL 的 CSV 文件并使用 Invoke-WebRequest 来获取与指定条件匹配的链接的 innerHTML 和 href 值,但这仅适用于某些 URL,而不适用于其他 URL,除非我添加参数 -UseBasicParsing 不t 提供我需要的属性访问和过滤功能。

一个共同点是,那些不起作用的都使用 www 子域,但其中一些仍然可以在没有这个的情况下访问,但仍然不起作用,我不确定这应该是一个问题,因为其他 www URL 确实有效

如上所述,我尝试添加允许连接的 UseBasicParsing,但这限制了我可以访问的数据。我还查看了 URLS 的 http 标头,以尝试了解差异是什么,但不确定问题是什么。

这可以正确运行并返回页面上每个链接的 innerHTML 文本和 href

$currentRequest = Invoke-WebRequest -Uri https://moz.com/learn/seo/what- 
is-seo
$currentRequest | Get-Member
$currentRequest = $currentRequest.Links |
Select innerHTML, href |
WHERE innerHTML -like *SEO*
$currentRequest

使用与以下 URL 完全相同的代码,控制台只是冻结,直到脚本退出

https://www.redevolution.com/what-is-seo

当我使用工作 URL 运行脚本时,我会为每个链接获得一对值,如下所示

innerHTML : Recommended SEO Companies
href      : https://moz.com/community/recommended

使用上面提到的非工作 URL,命令行只会停留在闪烁的光标处。

这只是一个示例,我还需要查询其他数据,因此很高兴了解我如何能够始终如一地运行 Invoke-WebRequest 而不会出现问题。

非常感谢!!

麦克风

4

2 回答 2

1

与其说是答案,不如说是长评论...

在 PowerShell 5.1 中,Invoke-WebRequest 使用 Internet Explorer 引擎将 html 解析为 DOM,这也可能导致执行页面上的任何脚本,因此脚本中可能出现问题,或者无头 Internet Explorer 实例没有'不喜欢页面内容,无论出于何种原因。

在其他地方还有其他报告同样的问题 - 例如Invoke-WebRequest 在某些情况下挂起,除非使用 -UseBasicParsing

添加-UseBasicParsing开关绕过 Internet Explorer 并使用更简单的内部 HTML 解析器 - 如果您需要提取其他信息,您可以使用 HTML 解析器库(如HtmlAgilityPackAngleSharp)来解析和查询$currentRequest.Content属性。

请注意,PowerShell Core 6.0 及更高版本已将-UseBasicParsing开关设为默认行为,实际上无法将其关闭,因此如果您现在想编写面向未来的脚本,最好找到一种方法来解决您的问题,-UseBasicParsing这样您就不用如果/当您想升级到 PowerShell Core 时,必须重写它。(请参阅PowerShell 6.0 的重大更改 -> 对 Web Cmdlet 的更改

有关相关问题,请参阅如何在 Powershell Core 中解析 html 。

于 2019-08-31T19:00:13.740 回答
1

首先,在“有效”的代码中,即您的第一个示例代码中,您缺少-UseBasicParsing。现在,为什么会这样。此处的文档解释了原因:https ://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-5.1

引用:“默认情况下,网页中的脚本代码可能会在解析页面以填充 ParsedHtml 属性时运行。使用 -UseBasicParsing 开关来抑制这一点。”

如果您查看 PowerShell v6,默认解析已切换到“-UseBasicParsing”(请参见此处:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-webrequest?视图=powershell-6

这不是很好,b/c 你提到的原因,不幸的是没有缓解(请参阅此处 PowerShell 开发人员的评论:https ://twitter.com/Steve_MSFT/status/1153456742719639552?s=20 )

于 2019-08-31T19:03:45.557 回答