PowerShell脚本提取URL失败:特殊字符处理问题求助
问题描述
我在film_disponibili.txt中存储了以下电影名:
La forza dell'amore La forza della volontà La fuga - Girl in Flight
html_di_test.txt包含如下HTML代码:
<a href="https://cb01.clinic/la-forza-dellamore-b-n-1936/">La forza dell’amore [B/N] (1936)</a> <a href="https://cb01.clinic/la-forza-della-volonta-hd-1988/">La forza della volontà [HD] (1988)</a> <a href="https://cb01.clinic/la-fuga-girl-in-flight-hd-2016/">La fuga – Girl in Flight [HD] (2016)</a> <a href="https://cb01.clinic/lo-studente-1982/">Lo studente (1982)</a>
目标是提取对应电影的URL到urls_estratti.txt,预期结果:
https://cb01.clinic/la-forza-dellamore-b-n-1936/ https://cb01.clinic/la-forza-della-volonta-hd-1988/ https://cb01.clinic/la-fuga-girl-in-flight-hd-2016/
但实际仅提取到一个URL:
https://cb01.clinic/la-forza-della-volonta-hd-1988/
问题出在特殊字符(撇号、破折号、重音)的处理不当,原PowerShell代码如下:
$films = Get-Content .\film_disponibili.txt $html = Get-Content .\html_di_test.txt -Raw $urls = foreach ($film in $films) { $film_decoded = [System.Web.HttpUtility]::HtmlDecode($film) $regex = '.*<a href="(https://cb01.clinic/.*)">' + [regex]::Escape($film_decoded) + '.*' $match = [regex]::Match($html, $regex) if ($match.Success) { $match.Groups[1].Value } } $urls | Set-Content .\urls_estratti.txt
问题原因
- HTML实体未解码:HTML中的撇号是
’、破折号是–,原代码直接用原始HTML匹配,未解码这些实体,导致和本地文件中的普通'、-无法匹配。 - 不必要的电影名称解码:本地文件的电影名没有HTML实体,
HtmlDecode操作无效,反而可能引入意外问题。
解决方法
先对整个HTML内容进行解码,将所有HTML实体转换为普通字符,再在解码后的文本中匹配电影名称,同时正确转义正则特殊字符:
# 读取电影列表和HTML内容 $films = Get-Content .\film_disponibili.txt $rawHtml = Get-Content .\html_di_test.txt -Raw # 解码HTML中的所有实体,将特殊字符转为普通形式 $decodedHtml = [System.Web.HttpUtility]::HtmlDecode($rawHtml) $urls = foreach ($film in $films) { # 转义电影名称中的正则特殊字符,避免干扰匹配 $escapedFilm = [regex]::Escape($film) # 构建正则:精准匹配包含目标电影名的a标签,提取href属性值 $regexPattern = '<a href="(https://cb01.clinic/[^"]+)">.*?' + $escapedFilm + '.*?</a>' # 启用单行模式,确保匹配逻辑兼容可能的多行a标签结构 $match = [regex]::Match($decodedHtml, $regexPattern, [System.Text.RegularExpressions.RegexOptions]::Singleline) if ($match.Success) { $match.Groups[1].Value } } # 将提取到的URL写入目标文件 $urls | Set-Content .\urls_estratti.txt
额外说明
- 解码HTML后,
’会转为',–会转为普通破折号,和本地电影名的字符完全一致,解决了核心匹配问题。 - 使用
[^"]+匹配URL比.*更精准,避免贪婪匹配捕获到多余内容。 - 启用
Singleline模式是为了兼容可能的多行a标签结构,即使目标文件每行一个标签,加上该模式也不会影响匹配效果。
内容的提问来源于stack exchange,提问作者user3520363
相关产品推荐
相关产品推荐

