
使用正则表达式直接解析 HTML 易导致误匹配(如截断 URL、捕获非 JS 资源),应改用标准 HTML 解析器(如 html.parser)精准提取 <script src="..."> 中的 URL。
使用正则表达式直接解析 html 易导致误匹配(如截断 url、捕获非 js 资源),应改用标准 html 解析器(如 `html.parser`)精准提取 `<script src="...">` 中的 url。</script>
在网页爬虫开发中,一个常见误区是试图用正则表达式(re 模块)从 HTML 源码中提取 <script> 标签的 src 属性值。例如以下代码看似简洁:
import re
import requests
sitemap = requests.get("https://youtube.com").text
javascriptmatches = re.findall(r'src="(https?://.*?\.js)\??[^"]*"', sitemap)
for url in javascriptmatches:
print(url)但该正则存在严重缺陷:
- .*? 是贪婪回溯型匹配,在复杂 HTML(含大量嵌套属性、注释、内联脚本)中极易跨标签匹配;
- 无法识别 HTML 实体(如 "、&)、引号类型混用(单/双引号)、属性顺序变化;
- 如问题中所示,它可能从 <script src="a.js"> 开始匹配,却一路延伸到后续 <input id="search"... 的闭合引号,最终捕获一个超长、无效的“伪 URL”。
✅ 正确做法:使用专为 HTML 设计的解析器,如 Python 内置的 html.parser。它能真实还原 DOM 结构,按标签生命周期事件处理,确保只提取合法 <script> 标签中 src 属性的真实值。
以下是推荐的健壮实现:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
from html.parser import HTMLParser
import requests
class ScriptSrcExtractor(HTMLParser):
def __init__(self):
super().__init__()
self.script_urls = []
def handle_starttag(self, tag, attrs):
if tag == "script":
# 遍历所有属性 (name, value) 元组
for attr_name, attr_value in attrs:
if attr_name == "src" and attr_value and attr_value.endswith(".js"):
self.script_urls.append(attr_value)
if __name__ == "__main__":
response = requests.get("https://youtube.com", timeout=10)
response.raise_for_status() # 确保请求成功
parser = ScriptSrcExtractor()
parser.feed(response.text)
print("Found JS files:")
for url in parser.script_urls:
print(f" → {url}")? 关键改进说明:
- ✅ 严格限定作用域:仅在 <script> 开始标签中检查 src 属性,完全规避跨标签污染;
- ✅ 属性名精确匹配:用 attr_name == "src" 替代模糊字符串搜索,避免误触 data-src 或 srcset;
- ✅ 可选校验:增加 endswith(".js") 过滤,排除非 JS 资源(如 .json 或无扩展名的动态端点);
- ✅ 安全容错:自动处理 HTML 实体解码(parser 默认已处理)、空格与换行,无需手动 unquote();
- ✅ 易于扩展:后续可轻松添加 integrity、crossorigin 等属性提取逻辑。
⚠️ 注意事项:
- 不要对 HTML 使用正则进行结构化提取——这是被广泛警告的反模式;
- 若需更高级功能(如 CSS 选择器、XPath),可选用 BeautifulSoup(配合 lxml 或 html.parser 后端)或 lxml.etree;
- 对于大型页面,建议设置 requests 的 timeout 和 headers={'User-Agent': ...},避免被服务端拒绝。
总之,解析 HTML,请信任解析器,而非正则——这是构建稳定、可维护网络爬虫的第一道防线。


















