本文介绍在 node.js 网页爬虫中,如何从 html 字符串中精准提取 `` 标签内 `href` 属性指向的 css 文件完整路径(如 `/assets/css/style.css`),避免简单字符串截取导致的路径不完整或误匹配问题。
在网页抓取场景中,仅依赖 indexOf('.css') 并向前截取字符串(如 substring(0, index))存在明显缺陷:它无法识别属性边界,容易截断到错误位置(例如混入 class="main-css" 中的 .css)、遗漏协议/路径、或因换行/空格/属性顺序变化而失效。更健壮的方式是基于 HTML 结构语义进行解析——优先匹配 标签中 rel="stylesheet"(或兼容无 rel 属性但含 href 的样式链接),再安全提取 href 值。
推荐使用正则表达式进行轻量级提取(适用于已知 HTML 结构较规范的场景)。以下是一个经

const extractCssUrls = (htmlString) => {
// 匹配 标签中 href 属性值,要求标签包含 rel="stylesheet"(可选位置),且 href 在同一标签内
const regex = /]*rel\s*=\s*["']stylesheet["'][^>]*href\s*=\s*["']([^"']+)["'][^>]*>|]*href\s*=\s*["']([^"']+)["'][^>]*rel\s*=\s*["']stylesheet["'][^>]*>/gi;
const matches = [...htmlString.matchAll(regex)];
return matches.map(m => m[1] || m[2]).filter(Boolean);
};
// 示例使用
const htmlString = `
`;
console.log(extractCssUrls(htmlString));
// 输出: [ '/assets/css/main.css', 'https://cdn.example.com/lib/theme.css', '/static/css/print.css' ]✅ 关键设计说明:
⚠️ 注意事项:
const cheerio = require('cheerio');
const $ = cheerio.load(htmlString);
const cssUrls = $('link[rel="stylesheet"][href]').map((_, el) => $(el).attr('href')).get();综上,与其“向前截取字符”,不如“定位结构并提取属性”——这是 Web 抓取中处理 HTML 内容的通用原则,既提升准确性,也增强代码可维护性。