
使用正则表达式直接解析 HTML 易导致误匹配(如截断 URL、捕获非 JS 资源),应改用标准 HTML 解析器(如 html.parser)精准提取 中的 URL。
使用正则表达式直接解析 html 易导致误匹配(如截断 url、捕获非 js 资源),应改用标准 html 解析器(如 `html.parser`)精准提取 `<script src="...">` 中的 url。</script>
在网页爬虫开发中,一个常见误区是试图用正则表达式(re 模块)从 HTML 源码中提取 <script> 标签的 src 属性值。例如以下代码看似简洁:</script>
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”。</script>
✅ 正确做法:使用专为 HTML 设计的解析器,如 Python 内置的 html.parser。它能真实还原 DOM 结构,按标签生命周期事件处理,确保只提取合法 <script> 标签中 src 属性的真实值。</script>
以下是推荐的健壮实现:
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
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 属性,完全规避跨标签污染; </script>
- ✅ 属性名精确匹配:用 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,请信任解析器,而非正则——这是构建稳定、可维护网络爬虫的第一道防线。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










