You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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&#8217;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 &#8211; 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
问题原因
  1. HTML实体未解码:HTML中的撇号是&#8217;、破折号是&#8211;,原代码直接用原始HTML匹配,未解码这些实体,导致和本地文件中的普通'、-无法匹配。
  2. 不必要的电影名称解码:本地文件的电影名没有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后,&#8217;会转为',&#8211;会转为普通破折号,和本地电影名的字符完全一致,解决了核心匹配问题。
  • 使用[^"]+匹配URL比.*更精准,避免贪婪匹配捕获到多余内容。
  • 启用Singleline模式是为了兼容可能的多行a标签结构,即使目标文件每行一个标签,加上该模式也不会影响匹配效果。

内容的提问来源于stack exchange,提问作者user3520363

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:05:46