BeautifulSoup – парсинг HTML в Python на примерах

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


Данная инструкция по 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 указывает на его содержимое.

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("HTML: {0}, name: {1}, text: {2}".format(soup.h2,

soup.h2.name,soup.h2.text))

Код в примере позволяет вывести HTML-код, название и текст h2 тега.

Shell

1

2

$./tags_names.py

HTML:<h2>Operating systems</h2>,name:h2,text:Operating systems

Это результат вывода.

BeautifulSoap перебираем HTML теги

Метод recursiveChildGenerator() позволяет перебрать содержимое HTML-документа.

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')

forchild insoup.recursiveChildGenerator():

ifchild.name:

print(child.name)

Данный пример позволяет перебрать содержимое HTML-документа и вывести названия всех его тегов.

Shell

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

$./traverse_tree.py

html

head

title

meta

body

h2

ul

li

li

li

li

li

p

p

Данные теги являются частью рассматриваемого HTML-документа.

BeautifulSoup атрибут children

При помощи атрибута children можно вывести все дочерние теги.

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')

root=soup.html

root_childs=[e.name foreinroot.children ife.name isnotNone]

print(root_childs)

В данном примере извлекаются дочерние элементы html тега, после чего они помещаются в список Python и выводятся в консоль. Так как атрибут children также убирает пробелы между тегами, необходимо добавить условие, которое позволяет выбирать только названия тегов.

Shell

1

2

$./get_children.py

['head','body']

Следовательно, у тегов html есть два дочерних элемента: head и body.

BeautifulSoup атрибут descendants

При помощи атрибута descendants можно получить список всех потомков (дочерних элементов всех уровней) рассматриваемого тега.

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')

root=soup.body

root_childs=[e.name foreinroot.descendants ife.name isnotNone]

print(root_childs)

Данный пример позволяет найти всех потомков главного тега 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.


Источник: python-scripts.com

Комментарии: