Скорая Компьютерная Помощь г. Калуга

Полный спектр компьютерных услуг!

Здравствуйте, гость ( Вход | Регистрация )

> Внимание!

  • Вся информация, расположенная в данном и других разделах форума получена из открытых источников (интернет-ресурсы, средства массовой информации, печатные издания и т.п.) и/или добавлена самими пользователями. Администрация форума предоставляет его участникам площадку для общения / размещения файлов / статей и т.п. и не несет ответственности за содержание сообщений, а также за возможное нарушение авторских, смежных и каких-либо иных прав, которое может повлечь за собой информация, содержащаяся в сообщениях.
 
Ответить в эту темуОткрыть новую тему
> Python / [Перевод] Лёгкий парсинг сайтов с помощью «Beautiful Soup». Часть 1
Decker
сообщение 25.2.2011, 18:29
Сообщение #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.cool.gif
# <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')
print
raw_input()




Так, как «Хабр» в «UTF-8», то мы используем «decode('utf8')» для того, чтобы кириллица отображалась нормально.



Конец первой части.

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



PS.

Из оригинальной документации были изменены некоторые исходники и добавлены новые комментарии к исходному коду.
Original source: habrahabr.ru (comments).

Читать дальше


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

Текстовая версия Сейчас: 4.7.2025, 23:23
Яндекс цитирования