![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 ![]() |
Описание библиотеки «Beautiful Soup» — это HTML/XML парсер для Python, который может превратить даже невалидную разметку в удобное дерево для парсинга. Он предоставляет простые, идиоматические пути навигации, поиска и изменения дерева для парсинга. Данная библиотека способна сэкономить многие часы работы программиста. Существует также версия для «Ruby», под названием «Rubyful Soup». В данной статье описаны все основные возможности библиотеки «Beautiful Soup», а также примеры работы. После прочтения статьи вы поймёте как работает библиотека, как её использовать и как сделать так, чтобы библиотека выполняла нужную работу. Быстрый старт Скачать библиотеку можно здесь. Список изменений описывает разницу между версией 3.0 и ранними версиями. Библиотеку можно использовать сразу же после того как вы её скачали (устанавливать её не придётся). Подключить «Beautiful Soup» можно подключить следующим образом: from BeautifulSoup import BeautifulSoup # Для обработки HTML from BeautifulSoup import BeautifulStoneSoup # Для обработки XML import BeautifulSoup # Чтобы получить всё Вот демонстрация базовых возможностей «Beautiful Soup». Вы можете использовать примеры указанные ниже, используя метод «copy-paste» (скопировать и вставить). from BeautifulSoup import BeautifulSoup import re doc = ['<html><head><title>Заголовок страницы</title></head>', '<body><p id="firstpara" align="center">Это параграф <b>один</b>.', '<p id="secondpara" align="blah">Это параграф <b>два</b>.', '</html>'] soup = BeautifulSoup(''.join(doc)) print soup.prettify() # <html> # <head> # <title> # Заголовок страницы # </title> # </head> # <body> # <p id="firstpara" align="center"> # Это параграф # <b> # один # </b> # . # </p> # <p id="secondpara" align="blah"> # Это параграф # <b> # два # </b> # . # </p> # </body> # </html> Вот несколько примеров навигации по дереву: soup.contents[0].name # u'html' # Выводим название тега с помощью «name» soup.contents[0].contents[0].name # u'head' # Выводим название тега, который является первым (0) наследником «html» head = soup.contents[0].contents[0] head.parent.name # u'html' # С помощью «parent» мы находим родительский элемент head.next # <title>Заголовок страницы</title> head.nextSibling.name # u'body' # С помощью «nextSibling» мы находим следующий по ветке элемент head.nextSibling.contents[0] # <p id="firstpara" align="center">Это параграф <b>один</b>.</p> head.nextSibling.contents[0].nextSibling # <p id="secondpara" align="blah">Это параграф <b>два</b>.</p> Ниже представлены несколько примеров выборки по названию тега или даже по свойствам: titleTag = soup.html.head.title titleTag # <title>Заголовок страницы</title> titleTag.string # u'Заголовок страницы' len(soup('p')) # 2 # с помощью «len» мы посчитали количество элементов «p» soup.findAll('p', align="center") # [<p id="firstpara" align="center">Это параграф <b>один</b>. </p>] # Находим все теги «p», у которых атрибут «align» равен «center» soup.find('p', align="center") # <p id="firstpara" align="center">Это параграф <b>два</b>. </p> soup('p', align="center")[0]['id'] # u'firstpara' soup.find('p', align=re.compile('^b.*'))['id'] # u'secondpara' soup.find('p').b.string # u'один' soup('p')[1].b.string # u'два' Редактировать дерево для парсинга не представит особых сложностей: titleTag['id'] = 'theTitle' titleTag.contents[0].replaceWith("Новый заголовок") soup.html.head # <head><title id="theTitle">Новый заголовок</title></head> soup.p.extract() soup.prettify() # <html> # <head> # <title id="theTitle"> # Новый заголовок # </title> # </head> # <body> # <p id="secondpara" align="blah"> # Это параграф # <b> # два # </b> # . # </p> # </body> # </html> soup.p.replaceWith(soup. ![]() # <html> # <head> # <title id="theTitle"> # Новый заголовок # </title> # </head> # <body> # <b> # два # </b> # </body> # </html> soup.body.insert(0, "Эта страница использует теги ") soup.body.insert(2, " <p> !") soup.body # <body>Эта страница использует теги <b>два</b> <p> !</body> А сейчас реальный пример! Мы выведем все элементы с классом «topic», взятые с главной странички «Хабрахабра». import urllib from BeautifulSoup import BeautifulSoup page = urllib.urlopen("http://habrahabr.ru/") soup = BeautifulSoup(page.read(), fromEncoding="utf-8") print soup.originalEncoding for topic in soup.findAll(True, 'topic'): print str(topic).decode('utf8') raw_input() Так, как «Хабр» в «UTF-8», то мы используем «decode('utf8')» для того, чтобы кириллица отображалась нормально. Конец первой части. В следующих частях мы познакомимся с проблемами при работе с данной библиотекой и постараемся их решить, научимся проверять элементы и более подробно изучим методы библиотеки. PS. Из оригинальной документации были изменены некоторые исходники и добавлены новые комментарии к исходному коду. Original source: habrahabr.ru (comments). Читать дальше -------------------- |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 4.7.2025, 23:23 | |
|