Добрый день. В этом видео мы продолжим изучать пакет Beautiful Soup и рассмотрим самые простейшие его методы для навигации по html. Те методы, в которые не надо передавать никакие параметры. Тем не менее, их будет достаточно для очень большого числа применений. Давайте приступим. Я уже написал здесь html, который мы будем использовать в качестве подопытного. Это довольно простой html, который состоит из тега <body>, у него есть некоторые атрибуты, и вложенных в него трех параграфов, у которых тоже есть атрибут class. В каждый из параграфов тоже вложены различные теги и просто текстовые строки. Мы передаем этот html в объект в модуль Beautiful Soup и получаем объект Soup, который и представляет тот самый python-объект для удобной работы с html. Давайте поиграемся с ним. Давайте просто его для начала выведем. Мы получаем тот же текст, который и был, что неудивительно. Есть также метод модуль method prettify, который выведет его красиво. Давайте посмотрим на это. Вот я его отформатировал с отступами. Все очень красиво. Давайте напишем soup.p и обратимся тем самым к первому тегу <p> внутри нашего html. Вот этот тег, то есть это наш первый тег. Давайте посмотрим, что за тип у этого объекта. Это BS4 элемент тег. То есть, это тег. Давайте обратимся к тегу <b> внутри тега <p>. Он, очевидно такой же. Поскольку внутри тега <b> у нас есть текстовая строка, она уже не является тегом, а просто строка, мы можем написать p.b.string, и тип у нее будет строка, строка Beautiful Soup. Это непростая строка, хотя, если мы ее выведем просто, она будет выглядеть как обычная строка bold на содержимое тега. Тем не менее, в отличие от обычной строки, она позволяет использовать методы для перехода к следующему элементу, предыдущему, то есть дополнительные методы, которых нет у простой строки. Если мы удалим отсюда p, то ничего не изменится, потому что Beautiful Soup найдёт первый тег <b>, а это всё тот же самый тег. Давайте попробуем еще немножечко поиграться и, например, выведем name, name - это, собственно, название самого тега, оно совпадает. Также мы можем написать P. Давайте выведем содержимое атрибута class. Для этого нам достаточно написать вот так и мы получим список классов, которые присвоены этому тегу. У нас в данном случае два класса text и odd. Но даже если бы у нас был один класс, мы получили все равно бы список, да с ним одним, но это был бы список, а не строка. Потому что в спецификации html класс - это такой атрибут, который может содержать много значений. Если атрибут может содержать много значений, то Beautiful Soup всегда будет его выводить как список. А, например, атрибут id всегда может содержать только одно значение, и поэтому Beautiful Soup будет всегда возвращать его в виде строки. Вот, например, у нас есть id у body. Давайте попробуем. body ['id'] , и это будет строка. Даже если мы допишем сюда через пробел еще какие-то значения, по-прежнему будет возвращена одна строка, не будет списка, потому что в спецификации html ID не может содержать много элементов. Давайте вернем все, как было. Давайте еще попробуем, например, вывести родительский тег. Вот мы возьмем, например, тег <b> и выведем его родителя, для этого достаточно написать parent, и это будет наш тег <p>, который является родительским. Также мы можем вывести всех родителей тега <b>. Для этого достаточно написать parents, но это будет генератор. Соответственно, например, если мы захотим вывести все названия тегов, которые идут выше нашего тега <b>, мы можем написать tag.name for tag in parents и сделать из этого список. Мы получили, что выше нашего тега <b> идет <p>, выше него идет <body>, выше него идет <html>, и все это внутри корневого элемента document, который является объектом Beautiful Soup. Также мы можем попробовать получить следующий элемент, идущий, например, за нашим тегом <p>. Для этого достаточно написать p.next. Следующим элементом будет, на самом деле не следующий параграф, а следующий непосредственно за ним. В данном случае first, то есть включая вложенные теги. Если мы напишем p.next.next, то мы получим, очевидно, наш тег <b>. А если мы хотим все-таки получить следующий элемент, исключая вложенные, то есть, тот, который идет непосредственно за этим <p>, а не внутри него, мы можем написать next_sibling, но результат нас может слегка удивить, потому что непосредственно за этим тегом <p> идет не следующий тег <p>, а перевод строки, потому что у нас здесь отформатировано всё. Я думаю, что если бы мы написали эти теги слитно, вот так, то мы бы получили следующий тег, а так у нас здесь есть незримо строка с переводом строки, но зато мы можем написать ещё раз next_sibling от next_sibling и получить уже следующий параграф. Что мы еще можем сделать? Можем получить все вложенные теги внутри какого-то тега. Для этого мы можем написать contents, и нам будет выведен список, состоящий из вложенных как тегов, так и строк, именно в виде списка. Если мы хотим получить не список, а генератор, то contents можно заменить на children. Мы получаем генератор, соответственно, если мы передадим конструктору списков, то мы получим то же самое, что мы получали с помощью contets. Это основные простые методы Beautiful Soup. Как вы видите, с их помощью можно перемещаться. Найдя какой-то один элемент, можно переместиться к следующему, к родителю, также можно переместиться к предыдущему элементу, к любому из детей. В общем-то эти методы позволяют достаточно удобно делать навигацию по html. А в следующем видео мы рассмотрим уже более сложные методы, которые позволяют фильтровать те элементы, к которым мы переходим.