如何使用HtmlAgilityPack提取页面脚本src中的特定文本
使用HtmlAgilityPack提取JavaScript中oScript.src里的"ethereum"部分
没问题,我来帮你搞定这个需求!你要提取的是嵌在<script>标签里JS代码中oScript.src属性里的子reddit名称(也就是这里的ethereum),用HtmlAgilityPack结合正则就能轻松实现,步骤如下:
1. 定位目标<script>节点
首先,我们需要用HtmlAgilityPack加载你的HTML页面,然后找到包含这段Reddit懒加载代码的<script>标签。因为页面里可能有多个script标签,我们可以通过代码里的特定注释/* Reddit lazy load hack */来精准筛选:
using HtmlAgilityPack; // 加载HTML文档(可以是本地字符串或远程页面) HtmlDocument htmlDoc = new HtmlDocument(); htmlDoc.LoadHtml(yourHtmlContent); // 如果你是加载远程页面,用 new HtmlWeb().Load("your-page-url") // 筛选出包含目标JS代码的script节点 var targetScriptNode = htmlDoc.DocumentNode .SelectNodes("//script") ?.FirstOrDefault(script => script.InnerText.Contains("Reddit lazy load hack")); if (targetScriptNode == null) { // 处理找不到目标script的情况,比如抛出提示或返回空 Console.WriteLine("未找到包含目标Reddit代码的script标签"); return; }
2. 提取并解析JS代码中的目标内容
拿到script节点的文本内容后,我们用正则表达式匹配oScript.src的赋值语句,精准捕获r/后面到.embed之前的子reddit名称。这个正则能兼容代码里的空格、单双引号等小变动:
using System.Text.RegularExpressions; // 获取script标签内的JS代码文本 string jsCode = targetScriptNode.InnerText; // 定义正则:匹配oScript.src的赋值,捕获r/后的子reddit名称 Regex subredditRegex = new Regex( @"oScript\.src\s*=\s*["']https:\/\/www\.reddit\.com\/r\/([^."']+)\.embed", RegexOptions.IgnoreCase ); Match matchResult = subredditRegex.Match(jsCode); if (matchResult.Success) { // Groups[1]就是我们要的"ethereum" string targetSubreddit = matchResult.Groups[1].Value; Console.WriteLine($"提取到的子reddit名称:{targetSubreddit}"); } else { Console.WriteLine("未匹配到目标src属性中的子reddit名称"); }
小提示
- 如果你的HTML页面里的JS代码格式有细微变化(比如引号用单引号、赋值前后有更多空格),这个正则依然能正常工作,因为我们用了
\s*匹配任意空格,["']兼容单双引号,[^."']+确保只捕获到.embed之前的有效子reddit名称。 - 一定要确保筛选script节点的条件足够精准,避免误抓其他无关的script标签。
内容的提问来源于stack exchange,提问作者Zoinky
相关产品推荐
相关产品推荐

