Python BeautifulSoup: Retrieve all descendants of the body tag from a given web page

BeautifulSoup: Exercise-15 with Solution

Write a Python program to retrieve all descendants of the body tag from a given web page.

Sample Solution:

Python Code:

import requests
from bs4 import BeautifulSoup
url = 'https://www.python.org/'
reqs = requests.get(url)
soup = BeautifulSoup(reqs.text, 'lxml')
print("\nDescendants of the body tag (https://www.python.org):\n")
root = soup.html    
root_childs = [e.name for e in root.descendants if e.name is not None]

Sample Output:

Descendants of the body tag (https://www.python.org):

['head', 'meta', 'meta', 'link', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'script', 'link', 'link', 'link', 'link', 'link', 'link', 'link', 'link', 'meta', 'meta', 'meta', 'title', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'meta', 'link', 'link', 'link', 'link', 'link', 'script', 'script', 'body', 'div', 'div', 'p', 'strong', 'div', 'nav', 'div', 'a', 'a', 'span', 'span', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'a', 'span', 'span', 'header', 'div', 'h1', 'a', 'img', 'div', 'a', 'div', 'a', 'span', 'form', 'fieldset', 'span', 'label', 'input', 'button', 'span', 'div', 'ul', 'li', 'a', 'strong', 'small', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'div', 'ul', 'li', 'a', 'ul', 'li', 'a', 'span', 'li', 'a', 'span', 'li', 'a', 'span', 'span', 'nav', 'ul', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'div', 'div', 'ul', 'li', 'a', 'span', 'ul', 'li', 'div', 'pre', 'code', 'span', 'span', 'div', 'h1', 'p', 'a', 'li', 'div', 'pre', 'code', 'span', 'span', 'span', 'span', 'div', 'h1', 'p', 'a', 'li', 'div', 'pre', 'code', 'span', 'span', 'span', 'span', 'span', 'span', 'span', 'div', 'h1', 'p', 'code', 'code', 'code', 'code', 'code', 'a', 'li', 'div', 'pre', 'code', 'span', 'span', 'span', 'span', 'div', 'h1', 'p', 'a', 'li', 'div', 'pre', 'code', 'span', 'span', 'div', 'h1', 'p', 'code', 'code', 'code', 'code', 'a', 'div', 'p', 'span', 'a', 'div', 'div', 'section', 'div', 'span', 'i', 'span', 'a', 'div', 'div', 'h2', 'span', 'p', 'p', 'a', 'div', 'h2', 'span', 'p', 'p', 'a', 'div', 'h2', 'span', 'p', 'p', 'a', 'div', 'h2', 'span', 'p', 'strong', 'p', 'a', 'div', 'div', 'div', 'h2', 'span', 'p', 'a', 'ul', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'div', 'div', 'h2', 'span', 'p', 'a', 'ul', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'li', 'time', 'span', 'a', 'div', 'div', 'div', 'h2', 'span', 'p', 'a', 'div', 'blockquote', 'a', 'table', 'tbody', 'tr', 'td', 'p', 'a', 'em', 'div', 'div', 'h2', 'span', 'p', 'a', 'ul', 'li', 'b', 'span', 'a', 'a', 'a', 'a', 'a', 'a', 'li', 'b', 'span', 'a', 'a', 'a', 'a', 'a', 'a', 'li', 'b', 'span', 'a', 'a', 'a', 'li', 'b', 'span', 'a', 'a', 'a', 'li', 'b', 'span', 'a', 'a', 'a', 'div', 'h2', 'span', 'a', 'span', 'span', 'a', 'span', 'div', 'div', 'h2', 'span', 'a', 'p', 'a', 'p', 'a', 'a', 'footer', 'div', 'div', 'a', 'span', 'span', 'ul', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'ul', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'li', 'a', 'a', 'span', 'span', 'div', 'div', 'ul', 'li', 'a', 'span', 'li', 'a', 'span', 'li', 'a', 'li', 'a', 'span', 'div', 'p', 'small', 'span', 'span', 'a', 'span', 'a', 'span', 'a', 'span', 'a', 'script', 'script', 'script', 'script', 'script']

Python Code Editor:

Have another way to solve this solution? Contribute your code (and comments) through Disqus.

Previous: Write a Python program to retrieve children of the html tag from a given web page.
Next: Write a Python program to retrieve the HTML code of the title, its text, and the HTML code of its parent.

What is the difficulty level of this exercise?

Test your Python skills with w3resource's quiz

Python: Tips of the Day

Getting the last element of a list:

some_list[-1] is the shortest and most Pythonic.

In fact, you can do much more with this syntax. The some_list[-n] syntax gets the nth-to-last element. So some_list[-1] gets the last element, some_list[-2] gets the second to last, etc, all the way down to some_list[-len(some_list)], which gives you the first element.

You can also set list elements in this way. For instance:

>>> some_list = [1, 2, 3]
>>> some_list[-1] = 5 # Set the last element
>>> some_list[-2] = 3 # Set the second to last element
>>> some_list
[1, 3, 5]

Note that getting a list item by index will raise an IndexError if the expected item doesn't exist. This means that some_list[-1] will raise an exception if some_list is empty, because an empty list can't have a last element.

Ref: https://bit.ly/3d8TfFP