我正在做一个项目,我需要提取歌词播放的和弦。目标是找出歌词的哪个部分在哪个和弦下演奏。我正在使用包含来自ultimate-guitar.com 的吉他和弦的网页(我选择这个网站是因为它似乎拥有最多的转录歌曲集合)
网页的典型结构是:
例如: http ://tabs.ultimate-guitar.com/p/poets_of_the_fall/carnival_of_rust_crd.htm
片段:
正如你所看到的,和弦写在歌词之前,左边距的相对位置决定了哪个和弦在哪个单词上播放。上述歌曲的页面源代码如下所示:
我完成任务的策略:
- 使用美汤找到网页的上述相关部分(忽略网页上的广告、索引)
- 逐行阅读此部分。
- 使用
<span>
标签来识别哪些行包含和弦。 - 假设具有标签的行之后的下一行将包含
- 找出每个和弦的相对位置,将其存储并与下面一行中的单词位置进行比较,以找出哪些和弦在哪些和弦上演奏。
- 将此数据存储在字典中,以和弦名称作为键,值将是在此键和弦上播放的短语列表。
上面的实现在某些情况下可以正常工作,但是由于没有定义特定的结构,所以只要不遵循假定的页面结构,它就会惨遭失败。
例如,(来源:http ://tabs.ultimate-guitar.com/k/kate_voegele/all_i_see_crd.htm )
这里之前有意外的<pre><i></i>
标签<span>
,现在我的密钥存储为<\pre><i></i>D
而不是D
.
由于页面结构的这种意外变化,我的解析数据中存在许多此类错误。关于如何处理此类案件的任何想法,或者是否有更好的方法来完成这项任务?