使用Python从网页中提取半结构化用户生成的内容

时间:2013-09-18 03:08:27

标签: python html parsing beautifulsoup

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

网页的典型结构是:

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

段: enter image description here

正如您所看到的,和弦在歌词之前写在线上,而左边距的相对位置决定了哪个和弦在哪些单词上播放。 上述歌曲的页面源代码如下: enter image description here

我完成任务的策略:

  1. 使用漂亮的汤找到上述相关部分(忽略网页上的广告,索引)
  2. 逐行阅读此部分。
  3. 使用<span>标记来标识哪些行包含和弦。
  4. 假设下一行包含标签的行将包含
  5. 找出每个和弦的相对位置,存储它并将其与下面一行中的单词位置进行比较,以找出哪些和弦在和弦上演奏。
  6. 将此数据存储在以和弦名称为键的字典中,值将是通过此键和弦播放的短语列表。
  7. 上述实现在某些情况下工作正常,但由于没有定义特定的结构,只要不遵循假定的页面结构,它就会失败。

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

    enter image description here

    此处<pre><i></i>之前有<span>个标记,现在我的密钥存储为<\pre><i></i>D,而不仅仅是D

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

2 个答案:

答案 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文档。

can we use xpath with BeautifulSoup?