2

我正在做一个项目,我需要提取歌词播放的和弦。目标是找出歌词的哪个部分在哪个和弦下演奏。我正在使用包含来自ultimate-guitar.com 的吉他和弦的网页(我选择这个网站是因为它似乎拥有最多的转录歌曲集合)

网页的典型结构是:

例如: http ://tabs.ultimate-guitar.com/p/poets_of_the_fall/carnival_of_rust_crd.htm

片段: 在此处输入图像描述

正如你所看到的,和弦写在歌词之前,左边距的相对位置决定了哪个和弦在哪个单词上播放。上述歌曲的页面源代码如下所示: 在此处输入图像描述

我完成任务的策略:

  1. 使用美汤找到网页的上述相关部分(忽略网页上的广告、索引)
  2. 逐行阅读此部分。
  3. 使用<span>标签来识别哪些行包含和弦。
  4. 假设具有标签的行之后的下一行将包含
  5. 找出每个和弦的相对位置,将其存储并与下面一行中的单词位置进行比较,以找出哪些和弦在哪些和弦上演奏。
  6. 将此数据存储在字典中,以和弦名称作为键,值将是在此键和弦上播放的短语列表。

上面的实现在某些情况下可以正常工作,但是由于没有定义特定的结构,所以只要不遵循假定的页面结构,它就会惨遭失败。

例如,(来源:http ://tabs.ultimate-guitar.com/k/kate_voegele/all_i_see_crd.htm )

在此处输入图像描述

这里之前有意外的<pre><i></i>标签<span>,现在我的密钥存储为<\pre><i></i>D而不是D.

由于页面结构的这种意外变化,我的解析数据中存在许多此类错误。关于如何处理此类案件的任何想法,或者是否有更好的方法来完成这项任务?

4

2 回答 2

0

正如您所说,您遇到了“意外变化”。

因此,处理这些情况的唯一方法是将其包含在您的逻辑中(例如,如果我们找到<i></i>标签,则忽略)

于 2013-09-18T04:23:08.770 回答
0

使用 XPath 会让您受益匪浅。( http://www.w3.org/TR/xpath/ )

不幸的是 BeautifulSoup 不支持它。考虑改用 lxml。

http://lxml.de/tutorial.html#using-xpath-to-find-text

根据这个 stackoverflow 帖子,您可以让它容忍损坏的 HTML/XML 文档。

我们可以将 xpath 与 BeautifulSoup 一起使用吗?

于 2013-09-18T04:25:11.013 回答