Данная инструкция по BeautifulSoup является вводным руководством по использованию библиотеки BeautifulSoup Python. В примерах показано использование тегов, модификация документа и перебор его элементов, а также парсинг веб-страниц.
Содержание статьи
BeautifulSoup на примерах
Установка BeautifulSoup в Python
Пример HTML-кода страницы
BeautifulSoup простой пример парсинга HTML
BeautifulSoup теги, атрибуты name и text
BeautifulSoap перебираем HTML теги
BeautifulSoup атрибут children
BeautifulSoup атрибут descendants
BeautifulSoup и веб-скрапинг HTML
BeautifulSoup метод prettify()
BeautifulSoup метод find(), поиск элементов по id
BeautifulSoup метод find_all() поиск всех тегов в HTML
BeautifulSoup методы select() и select_one() CSS селекторы
BeautifulSoup метод append() добавление нового HTML-тега
BeautifulSoup метод insert() вставка HTML-тега
BeautifulSoup метод replace_with() замена текста в теге
BeautifulSoup метод decompose() удаление HTML-тега
BeautifulSoup на примерах
BeautifulSoup является библиотекой Python для парсинга HTML и XML документов. Часто используется для скрапинга веб-страниц. BeautifulSoup позволяет трансформировать сложный HTML-документ в сложное древо различных объектов Python. Это могут быть теги, навигация или комментарии.
Установка BeautifulSoup в Python
Для установки необходимых модулей используется команда pip3.
Shell
1
$sudo pip3 install lxml
Мы собрали ТОП Книг для Python программиста которые помогут быстро изучить язык программирования Python. Список книг: Книги по Python
Для начала требуется установить lxml модуль, который используется в BeautifulSoup.
Shell
1
$sudo pip3 install bs4
BeautifulSoup устанавливается при помощи использования указанной выше команды.
Пример HTML-кода страницы
В последующих примерах будет использован данный HTML-файл:
XHTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
<head>
<title>Header</title>
<meta charset="utf-8">
</head>
<body>
<h2>Operating systems</h2>
<ul id="mylist"style="width:150px">
<li>Solaris</li>
<li>FreeBSD</li>
<li>Debian</li>
<li>NetBSD</li>
<li>Windows</li>
</ul>
<p>
FreeBSD is an advanced computer operating system used to
power modern servers, desktops, and embedded platforms.
</p>
<p>
Debian is a Unix-like computer operating system that is
composed entirely of free software.
</p>
</body>
</html>
BeautifulSoup простой пример парсинга HTML
В первом примере будет использован BeautifulSoup модуль для получения трех тегов.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
print(soup.h2)
print(soup.head)
print(soup.li)
Код в данном примере позволяет вывести HTML-код трех тегов.
Python
1
frombs4 importBeautifulSoup
Здесь производится импорт класса BeautifulSoup из модуля bs4. Таким образом, BeautifulSoup является главным рабочим классом.
Python
1
2
3
withopen("index.html","r")asf:
contents=f.read()
Открывается файл index.html и производится чтение его содержимого при помощи метода read().
Python
1
soup=BeautifulSoup(contents,'lxml')
Создается объект BeautifulSoup. Данные передаются конструктору. Вторая опция уточняет объект парсинга.
Python
1
2
print(soup.h2)
print(soup.head)
Далее выводится HTML-код следующих двух тегов: h2 и head.
Python
1
print(soup.li)
В примере много раз используются элементы li, однако выводится только первый из них.
Shell
1
2
3
4
5
6
7
$./simple.py
<h2>Operating systems</h2>
<head>
<title>Header</title>
<meta charset="utf-8"/>
</head>
<li>Solaris</li>
Это результат вывода.
BeautifulSoup теги, атрибуты name и text
Атрибут name указывает на название тега, а атрибут text указывает на его содержимое.
В данном примере извлекаются дочерние элементы html тега, после чего они помещаются в список Python и выводятся в консоль. Так как атрибут children также убирает пробелы между тегами, необходимо добавить условие, которое позволяет выбирать только названия тегов.
Shell
1
2
$./get_children.py
['head','body']
Следовательно, у тегов html есть два дочерних элемента: head и body.
BeautifulSoup атрибут descendants
При помощи атрибута descendants можно получить список всех потомков (дочерних элементов всех уровней) рассматриваемого тега.
Данный пример позволяет найти всех потомков главного тега body.
Shell
1
2
$./get_descendants.py
['h2','ul','li','li','li','li','li','p','p']
Перечисленные выше теги являются потомками главного тега body.
BeautifulSoup и веб-скрапинг HTML
Requests является простой HTTP библиотекой в Python. Она позволяет использовать разнообразные методы для получения доступа к веб-ресурсам при помощи HTTP.
Python
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python3
frombs4 importBeautifulSoup
importrequests asreq
resp=req.get("http://www.something.com")
soup=BeautifulSoup(resp.text,'lxml')
print(soup.title)
print(soup.title.text)
print(soup.title.parent)
Данный пример извлекает название рассматриваемой веб-страницы. Здесь также выводится имя ее родителя.
Python
1
2
3
resp=req.get("http://www.something.com")
soup=BeautifulSoup(resp.text,'lxml')
Здесь мы получаем информацию о веб-странице.
Python
1
2
3
print(soup.title)
print(soup.title.text)
print(soup.title.parent)
Код выше помогает вывести HTML-код заголовка, его текст, а также HTML-код его родителя.
Shell
1
2
3
4
$./scraping.py
<title>Something.</title>
Something.
<head><title>Something.</title></head>
Это результат вывода.
BeautifulSoup метод prettify()
При помощи метода prettify() можно добиться того, чтобы HTML-код выглядел аккуратнее.
Python
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/python3
frombs4 importBeautifulSoup
importrequests asreq
resp=req.get("http://www.something.com")
soup=BeautifulSoup(resp.text,'lxml')
print(soup.prettify())
Таким образом, мы оптимизируем HTML-код простой веб-страницы.
Shell
1
2
3
4
5
6
7
8
9
10
11
$./prettify.py
<html>
<head>
<title>
Something.
</title>
</head>
<body>
Something.
</body>
</html>
Это результат вывода.
BeautifulSoup метод find(), поиск элементов по id
При помощи метода find() можно найти элементы страницы, используя различные опорные параметры, id в том числе.
Python
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
#print(soup.find("ul", attrs={ "id" : "mylist"}))
print(soup.find("ul",id="mylist"))
Код в примере находит тег ul, у которого id mylist. Строка в комментарии является альтернативным способом выполнить то же самое задание.
BeautifulSoup метод find_all() поиск всех тегов в HTML
При помощи метода find_all() можно найти все элементы, которые соответствуют заданным критериям.
Python
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
fortag insoup.find_all("li"):
print("{0}: {1}".format(tag.name,tag.text))
Код в примере позволяет найти и вывести на экран все li теги.
Shell
1
2
3
4
5
$./find_all.py
li:Solaris
li:FreeBSD
li:Debian
li:NetBSD
Это результат вывода.
Метод find_all() также при поиске использует список из названий тегов.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
tags=soup.find_all(['h2','p'])
fortag intags:
print(" ".join(tag.text.split()))
В данном примере показано, как найти все h2 и p элементы, после чего вывести их содержимое на экран.
Метод find_all() также может использовать функцию, которая определяет, какие элементы должны быть выведены.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python3
frombs4 importBeautifulSoup
defmyfun(tag):
returntag.is_empty_element
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
tags=soup.find_all(myfun)
print(tags)
Данный пример выводит пустые элементы.
Shell
1
2
$./find_by_fun.py
[<meta charset="utf-8"/>]
Единственным пустым элементом в документе является meta.
Также можно найти запрашиваемые элементы, используя регулярные выражения.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/python3
importre
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
strings=soup.find_all(string=re.compile('BSD'))
fortxt instrings:
print(" ".join(txt.split()))
В данном примере выводится содержимое элементов, в которых есть строка с символами ‘BSD’.
Shell
1
2
3
4
$./regex.py
FreeBSD
NetBSD
FreeBSD isan advanced computer operating system used topower modern servers,desktops,andembedded platforms.
Это результат вывода.
BeautifulSoup методы select() и select_one() CSS селекторы
При помощи методов select() и select_one() для нахождения запрашиваемых элементов можно использовать некоторые CSS селекторы.
Python
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
print(soup.select("li:nth-of-type(3)"))
В данном примере используется CSS селектор, который выводит на экран HTML-код третьего по счету элемента li.
Shell
1
2
$./select_nth_tag.py
<li>Debian</li>
Данный элемент li является третьим в списке.
В CSS символ # используется для выбора тегов по их id-атрибутам.
Python
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
print(soup.select_one("#mylist"))
В данном примере выводятся элементы, которых есть id под названием mylist.
BeautifulSoup метод append() добавление нового HTML-тега
Метод append() добавляет в рассматриваемый HTML-документ новый тег.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
newtag=soup.new_tag('li')
newtag.string='OpenBSD'
ultag=soup.ul
ultag.append(newtag)
print(ultag.prettify())
В примере выше показано, как в HTML-документ добавить новый тег li.
Python
1
2
newtag=soup.new_tag('li')
newtag.string='OpenBSD'
Для начала, требуется создать новый тег при помощи метода new_tag().
Python
1
ultag=soup.ul
Далее создается сноска на тег ul.
Python
1
ultag.append(newtag)
Затем созданный ранее тег li добавляется к тегу ul.
Python
1
print(ultag.prettify())
Таким образом, тег ul выводится аккуратно отформатированным.
BeautifulSoup метод insert() вставка HTML-тега
Метод insert() позволяет вставить тег в определенно выбранное место.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
newtag=soup.new_tag('li')
newtag.string='OpenBSD'
ultag=soup.ul
ultag.insert(2,newtag)
print(ultag.prettify())
В примере показано, как поставить тег li на третью позицию в выбранном ul теге.
BeautifulSoup метод replace_with() замена текста в теге
Метод replace_with() заменяет содержимое выбранного элемента.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
tag=soup.find(text="Windows")
tag.replace_with("OpenBSD")
print(soup.ul.prettify())
В примере показано, как при помощи метода find() найти определенный элемент, а затем, используя метод replace_with(), заменить его содержимое.
BeautifulSoup метод decompose() удаление HTML-тега
Метод decompose() удаляет определенный тег из структуры документа и уничтожает его.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/python3
frombs4 importBeautifulSoup
withopen("index.html","r")asf:
contents=f.read()
soup=BeautifulSoup(contents,'lxml')
ptag2=soup.select_one("p:nth-of-type(2)")
ptag2.decompose()
print(soup.body.prettify())
В данном примере показано, как удалить второй элемент p в документе.
В данном руководстве было показано, как использовать библиотеку BeautifulSoup в Python.