Я работаю над проектом, для которого мне нужно извлечь аккорды, исполняемые над песнями песен. Цель состоит в том, чтобы найти, какую часть песни воспроизводится под тем аккордом. Я использую веб-страницы, содержащие аккорды гитары из ultimate-guitar.com (я выбрал этот сайт, потому что это, кажется, самая большая коллекция расшифрованных песен)Извлечение полуструктурированного пользовательского контента с веб-страниц с использованием Python
Типичная структура веб-страницы:
Например : http://tabs.ultimate-guitar.com/p/poets_of_the_fall/carnival_of_rust_crd.htm
Отрывок:
Как вы можете видеть, аккорды написаны на строке перед лирикой и относительное положение от левого края решает, какой аккорд воспроизводится через КН ich слова. Источник страницы для указанной выше композиции выглядит следующим образом:
Моя стратегия для выполнения этой задачи:
- Найти вышеупомянутую соответствующую часть (игнорировать объявления, указатели на веб-странице) веб-страницы, используя красивый суп
- Прочитайте этот фрагмент по строкам.
- Используйте тег
<span>
, чтобы определить, какие строки содержат аккорды. - Предположим, что следующая строка, следующая за тегами, будет содержать
- Узнайте об относительном положении каждого аккорда, сохраните его и сравните с положением слов в строке ниже, чтобы узнать, какие аккорды играют по каким аккордам.
- Сохраните эти данные в словаре с именем аккорда в качестве ключа, а значением будет список фраз, воспроизводимых в этом ключевом аккорде.
Вышеупомянутая реализация работает в некоторых случаях, но поскольку определенная структура не определена, она терпит неудачу, когда предполагаемая структура страницы не соблюдается.
Например, (Источник: http://tabs.ultimate-guitar.com/k/kate_voegele/all_i_see_crd.htm)
Здесь есть неожиданные <pre><i></i>
теги, прежде чем <span>
и теперь мой ключ хранится в <\pre><i></i>D
вместо просто D
.
И есть много таких ошибок в моих проанализированных данных из-за этого неожиданного изменения структуры страницы. Любые идеи о том, как можно обращаться с такими случаями или есть ли лучший способ выполнить эту задачу?
я получить свою точку зрения и может использовать это предложение, если набор данных был небольшим. Но у меня около 25000 файлов с некоторыми файлами, имеющими разные теги, что затрудняет этот подход. Было бы сложно вручную проверить каждый файл и добавить правило исключения для каждого случая в моем коде. – nakul225
Я не говорю, что вы должны сделать это для каждого конкретного случая. Вы можете (и должны) сделать общую логику исключения (путем угадывания какого рода исключения могут возникнуть), потому что это на самом деле то, что вы делаете, когда смотрите на код. Кодекс не сможет распознать, какие из них являются исключительным случаем, если вы не включите это как часть логики. Вы можете сделать что-то вроде очистки HTML сначала (например, удаление любых тегов внутри '
' тегов, которые не находятся в форме ' # CHORD_NAME #'). – justhalfВозможно, я неправильно понял ваши предыдущие комментарии. Спасибо, что разъяснил это дальше! Но я в настоящее время участвую в использовании lxml, чтобы проверить, могу ли я использовать его и упростить свой код. Если нет, то это кажется правильным путем. – nakul225