我正在制作一个项目,我需要提取用于歌词的和弦。 目标是找到在哪个和弦下播放的歌词部分。 我正在使用包含来自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
。
由于页面结构的这种意外变化,我的解析数据中存在许多此类错误。 关于如何处理这类案件的任何想法,还是有更好的方法来完成这项任务?
答案 0 :(得分:0)
正如您所说,您遇到了“意外变化”。
因此,处理这些案例的唯一方法是将其包含在您的逻辑中(例如,如果我们找到<i></i>
标记,则忽略)
答案 1 :(得分:0)
使用XPath可以从中受益匪浅。 (http://www.w3.org/TR/xpath/)
不幸的是BeautifulSoup不支持它。请考虑使用lxml。
http://lxml.de/tutorial.html#using-xpath-to-find-text
根据此stackoverflow帖子,您可以使其容忍破坏的HTML / XML文档。