我正在尝试使用以下代码在PowerShell中使用正则表达式抓取网页:
$webClient = New-Object System.Net.WebClient
$data = $webClient.downloadstring($url)
$h1Tag = [regex] '(?i)(?<=<h1 class="mb-0 mb-lg-1 svelte-jcq9ad">)([\S\s]*?)(?=<\/h1>)'
$h1 = $h1Tag.Match($data).value.trim()
要搜索的示例文本:
<div>
<h1 class="mb-0 mb-lg-1 svelte-jcq9ad">AdBlock — best ad blocker</h1>
<h2 class="mb-2 svelte-jcq9ad">Block ads and pop-ups on YouTube, Facebook, Twitch, and your favorite websites.</h2>
</div>
</div>
当我在几个正则表达式测试网站上测试正则表达式时,它正确地返回AdBlock - best ad blocker,但在PowerShell中$h1总是空的。我错过了什么?
编辑:我在我的问题中将$title更新为$h1。$title是我的一个错字- $h1是我应该说的。
2条答案
按热度按时间wf82jlnq1#
试试这个:
a0x5cqrl2#
先说重要的事
如前所述,你的正则表达式 does 与你的样例输入一起工作,这意味着样例输入并不能代表你的实际问题。
下面的代码 * 可能 * 解决了你的问题,因为它使用了更灵活的正则表达式,并且它还展示了在PowerShell中执行单个正则表达式匹配的惯用方法,使用**
-match
运算符**:注意事项:
-match
是大小写不敏感的 * 默认情况下 ( 所有 * 文本相关的PowerShell运算符也是如此),因此不需要(?i)
内联选项。(?s)
,以便允许.
也匹配 newlines,从而避免了[\s\S]
解决方案的需要。/
在PowerShell中永远不需要转义(如\/
),因为正则表达式被指定为普通的 * 字符串字面量 *(其中/
没有特殊含义)。\s+
,可选空格表示为\s*
,以及引号字符('
和"
都匹配)。注意:链接的页面使用C#字符串语法,但字符串内容与上面的相同(PowerShell和C#都使用.NET正则表达式引擎)。