2013-09-18 3 views
2

Я работаю над проектом, для которого мне нужно извлечь аккорды, исполняемые над песнями песен. Цель состоит в том, чтобы найти, какую часть песни воспроизводится под тем аккордом. Я использую веб-страницы, содержащие аккорды гитары из ultimate-guitar.com (я выбрал этот сайт, потому что это, кажется, самая большая коллекция расшифрованных песен)Извлечение полуструктурированного пользовательского контента с веб-страниц с использованием Python

Типичная структура веб-страницы:

Например : http://tabs.ultimate-guitar.com/p/poets_of_the_fall/carnival_of_rust_crd.htm

Отрывок: enter image description here

Как вы можете видеть, аккорды написаны на строке перед лирикой и относительное положение от левого края решает, какой аккорд воспроизводится через КН ich слова. Источник страницы для указанной выше композиции выглядит следующим образом: enter image description here

Моя стратегия для выполнения этой задачи:

  1. Найти вышеупомянутую соответствующую часть (игнорировать объявления, указатели на веб-странице) веб-страницы, используя красивый суп
  2. Прочитайте этот фрагмент по строкам.
  3. Используйте тег <span>, чтобы определить, какие строки содержат аккорды.
  4. Предположим, что следующая строка, следующая за тегами, будет содержать
  5. Узнайте об относительном положении каждого аккорда, сохраните его и сравните с положением слов в строке ниже, чтобы узнать, какие аккорды играют по каким аккордам.
  6. Сохраните эти данные в словаре с именем аккорда в качестве ключа, а значением будет список фраз, воспроизводимых в этом ключевом аккорде.

Вышеупомянутая реализация работает в некоторых случаях, но поскольку определенная структура не определена, она терпит неудачу, когда предполагаемая структура страницы не соблюдается.

Например, (Источник: 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.

И есть много таких ошибок в моих проанализированных данных из-за этого неожиданного изменения структуры страницы. Любые идеи о том, как можно обращаться с такими случаями или есть ли лучший способ выполнить эту задачу?

ответ

0

Как вы сказали, вы столкнулись с «неожиданным изменением».

Таким образом, единственный способ справиться с этим дела является, также, включают в себя, что в вашей логике (например, если мы найдем <i></i> метку, а затем игнорировать)

+0

я получить свою точку зрения и может использовать это предложение, если набор данных был небольшим. Но у меня около 25000 файлов с некоторыми файлами, имеющими разные теги, что затрудняет этот подход. Было бы сложно вручную проверить каждый файл и добавить правило исключения для каждого случая в моем коде. – nakul225

+1

Я не говорю, что вы должны сделать это для каждого конкретного случая. Вы можете (и должны) сделать общую логику исключения (путем угадывания какого рода исключения могут возникнуть), потому что это на самом деле то, что вы делаете, когда смотрите на код. Кодекс не сможет распознать, какие из них являются исключительным случаем, если вы не включите это как часть логики. Вы можете сделать что-то вроде очистки HTML сначала (например, удаление любых тегов внутри '

' тегов, которые не находятся в форме ' # CHORD_NAME #'). –
                        
                            
    justhalf
                                
                            
                        
                    

+0

Возможно, я неправильно понял ваши предыдущие комментарии. Спасибо, что разъяснил это дальше! Но я в настоящее время участвую в использовании lxml, чтобы проверить, могу ли я использовать его и упростить свой код. Если нет, то это кажется правильным путем. – nakul225

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?

Смежные вопросы