[[http://www.crummy.com/software/BeautifulSoup/|Beautiful Soup]] - это парсер для синтаксического разбора файлов HTML/XML, написанный на языке программирования Python, который может преобразовать даже неправильную разметку в дерево синтаксического разбора. Он поддерживает простые и естественные способы навигации, поиска и модификации дерева синтаксического разбора. В большинстве случаев он поможет программисту сэкономить часы и дни работы. Написанный на языке программирования Ruby порт называется Rubyful Soup. Данный документ иллюстрирует основные возможности Beautiful Soup версии 3.0 на примерах. Вы увидите, для чего лучше использовать данную библиотеку, как она работает, как ее использовать, как добиться необходимых вам результатов и что делать, когда она не оправдывает ваших ожиданий. <> = Быстрый старт = Скачать Beautiful Soup можно [[http://www.crummy.com/software/BeautifulSoup/#Download|здесь]]. [[http://www.crummy.com/software/BeautifulSoup/CHANGELOG.html|Список изменений]] содержит отличия версии 3.0 от более ранних. Подключить Beautiful Soup к вашему приложению можно с помощью одной из ниже приведенных строк: {{{#!highlight python from BeautifulSoup import BeautifulSoup # Для обработки HTML from BeautifulSoup import BeautifulStoneSoup # Для обработки XML import BeautifulSoup # Для обработки и того и другого }}} Следующий код демонстрирует основные возможности Beautiful Soup. Можете скопировать его в сессию Python и запустить. {{{#!highlight python from BeautifulSoup import BeautifulSoup import re doc = ['Page title', '

This is paragraph one.', '

This is paragraph two.', ''] soup = BeautifulSoup(''.join(doc)) print soup.prettify() # # # # Page title # # # #

# This is paragraph # # one # # . #

#

# This is paragraph # # two # # . #

# # }}} Продемонстрируем несколько способов навигации по супу: {{{#!highlight python soup.contents[0].name # u'html' soup.contents[0].contents[0].name # u'head' head = soup.contents[0].contents[0] head.parent.name # u'html' head.next # Page title head.nextSibling.name # u'body' head.nextSibling.contents[0] #

This is paragraph one.

head.nextSibling.contents[0].nextSibling #

This is paragraph two.

}}} А вот как искать в супе определенные теги или теги с заданными атрибутами: {{{#!highlight python titleTag = soup.html.head.title titleTag # Page title titleTag.string # u'Page title' len(soup('p')) # 2 soup.findAll('p', align="center") # [

This is paragraph one.

] soup.find('p', align="center") #

This is paragraph one.

soup('p', align="center")[0]['id'] # u'firstpara' soup.find('p', align=re.compile('^b.*'))['id'] # u'secondpara' soup.find('p').b.string # u'one' soup('p')[1].b.string # u'two' }}} Изменять суп также весьма просто: {{{#!highlight python titleTag['id'] = 'theTitle' titleTag.contents[0].replaceWith("New title") soup.html.head # New title soup.p.extract() soup.prettify() # # # # New title # # # #

# This is paragraph # # two # # . #

# # soup.p.replaceWith(soup.b) # # # # New title # # # # # two # # # soup.body.insert(0, "This page used to have ") soup.body.insert(2, " <p> tags!") soup.body # This page used to have two <p> tags! }}} Приведем реальный пример. Скачаем [[http://www.icc-ccs.org/|ICC Commercial Crime Services weekly piracy report]], произведем его синтаксический разбор с помощью Beautiful Soup и выведем на экран сообщения о случаях пиратства (piracy incidents): {{{#!highlight python import urllib2 from BeautifulSoup import BeautifulSoup page = urllib2.urlopen("http://www.icc-ccs.org/prc/piracyreport.php") soup = BeautifulSoup(page) for incident in soup('td', width="90%"): where, linebreak, what = incident.contents[:3] print where.strip() print what.strip() print }}} = Синтаксический разбор документа = Для работы конструктору Beautiful Soup требуется документ XML или HTML в виде строки (или открытого файлоподобного объекта). Он произведет синтаксический разбор и создаст в памяти структуры данных, соответствующие документу. Если обработать с помощью Beautiful Soup хорошо оформленный документ, то разобранная структура будет выглядеть также как и исходный документ. Но если его разметка будет содержать ошибки, то Beautiful Soup использует эвристические методы для построения наиболее подходящей структуры данных. == Синтаксический разбор HTML == Используйте класс !BeautifulSoup для синтаксического разбора документа HTML. Несколько фактов, которые необходимо знать о !BeautifulSoup: Некоторые теги могут быть вложенными (
), а некоторые - нет (

). Таблицы и списки тегов имеют естественный порядок вложенности. Например, теги появляются только в обрамлении тегов и никак иначе. Содержимое тега