需求背景:需要学习数学建模相关知识,每天的学习进度以小时计算,需要计算视频分段时间,用来安排学习进度。

问题:网上没有现成的 Bilibili 视频合集信息提取工具

思路:从 HTML 代码入手解决获取视频合集信息

直接上手:JavaScript Bookmarklet 小书签代码,安装之后点击直接将总时间复制到剪切板

JavaScript 代码实现

使用元素检查器可以看出分集的信息存在的 ul 标签中,ul 标签的上级是 cur-list class,所以写一个 for 循环可以解决。

使用 document.getElementsByClassName('list-box')[0] 获取到 list-box 中的内容。由于 getElementsByClassName 返回的是一个数组,所以此处需要使用 [0] 来获取第一个结果。从下图可以看出实际的分集内容在 li 内,目前最外面还只是 ul

所以可以再配合一个 querySelectorAll 选中所有的 li 标签,效果如下图所示,将内容赋值给变量,写一个 for 循环即可。

具体代码如下,由于稍后需要将数据放到 Excel 里求和,所以对于 12:34 这样的时间数据,需要在后面加上 .00 防止被 Excel 错误理解为 12 小时 34 分钟。中间的分割符使用 \t,让 Excel 可以识别到两个不同的列。

var result = '';
var content = document.getElementsByClassName('list-box')[0].querySelectorAll('li');
for (var i = 0; i< content.length; i++){
  temp = content[i].innerText.split('\n');
  if (temp[temp.length-1].length < 6){
    temp[temp.length-1] += ".00"
  }
  temp.join('\t')
  result += temp;
  result += '\n';
}
console.log(result.replace(/,/g, '\t'))

效果如下图所示,将输出结果复制到剪切板。

Excel 处理

新建 Excel 粘贴剪切板内容,由于标题长度不一,选中标题单元格,点击「开始 → 单元格 → 自动调整列宽」

使用 Excel 公式统计分集总时间,在 D2 单元格右下角点击 ➕ 自动填充所有总时间。

但是 Excel 默认的时间是 24 小时制,超过 24 小时的部分会被取余,所以需要对单元格的格式进行调整。选中 D 列单元格调整格式,输入自定义的 [hh]:mm:ss 格式应用即可。

最后效果如下图所示:

小技巧

上面的配图中,可以看到标题前面有集数序号,但是这是没有用的信息,可以考虑去除掉。可以使用正则表达式工具替换。此处给一个比较简便的解决方法,使用 perl 命令配合正则表达式解决,从 Excel 中复制标题列,在终端中运行该命令,运行完成后剪切板就是处理后的标题列,重新粘贴替换原来的标题列即可。

pbpaste|perl -pE 's/^\d+ //'|pbcopy