
本文介绍如何利用 requests-html 库通过 css 选择器精准定位并提取具有特定 class(如 `class="in-match"`)的 `` 标签中的 `href` 属性值,避免抓取无关链接,提升网页解析效率与准确性。
在网页数据采集实践中,常需从大量 HTML 链接中筛选出符合业务逻辑的特定目标链接(例如仅抓取“比赛详情页”对应的 )。原代码中直接调用 r.html.links 会返回页面中所有唯一 href 值(含导航栏、分页、广告等非目标链接),缺乏结构化控制,易引入噪声或遗漏关键路径。
Requests-HTML 提供了强大且简洁的 CSS 选择器支持(基于 PyQuery),推荐使用 find() 方法替代 links 属性,实现按标签语义精准提取。针对示例 HTML 中 的需求,正确做法是:
from requests_html import HTMLSession
matchlink = 'https://www.betexplorer.com/football/algeria/ligue-1/results/'
session = HTMLSession()
r = session.get(matchlink)
# 关键:使用 CSS 选择器定位带 in-match 类的 a 标签
anchor_elements = r.html.find('a.in-match')
match_urls = []
for elem in anchor_elements:
href = elem.attrs.get('href')
if href: # 防御性检查:确保 href 存在且非空
# 补全为绝对 URL(因原始 href 多为相对路径)
full_url = 'https://www.betexplorer.com' + href
match_urls.append(full_url)
print(full_url)
print(f"\n共提取 {len(match_urls)} 个 in-match 链接")✅ 核心优势说明:
- r.html.find('a.in-match') 返回的是 Element 对象列表,每个对象完整保留 DOM 结构与属性,可安全访问 elem.attrs['href'];
- 相比 r.html.links(全局去重、无上下文),该方式严格遵循 HTML 结构,确保只匹配目标 标签,不受其他 href(如 、
- 支持复杂选择器组合,例如 'td.h-text-left a.in-match' 可进一步限定父容器,增强鲁棒性。
⚠️ 注意事项:
立即学习“前端免费学习笔记(深入)”;
- 若目标页面依赖 JavaScript 渲染(如动态加载赛程),需调用 r.html.render() 后再执行 find();
- href 属性可能为相对路径(如 /football/https://www.php.cn/link/263b1243ca2dbeb358777ceabc4a2e4c),务必根据实际域名拼接为绝对 URL,否则后续请求将失败;
- 建议添加 try/except 或 attrs.get('href') 防御空值,避免因 HTML 结构异常导致 KeyError;
- 频繁创建 HTMLSession() 实例(如循环内新建 session)会显著降低性能,应复用单个 session 实例。
综上,精准提取本质是从“获取全部链接”转向“查询目标元素”。掌握 find() + CSS 选择器这一范式,不仅能解决 class="in-match" 场景,还可灵活适配 id、data-* 属性、嵌套关系等各类结构化提取需求,是构建稳定、可维护爬虫的关键基础能力。











