BeautifulSoup — Python библиотека, примеры использования

2724
BeautifulSoup - Python библиотека, примеры использования
BeautifulSoup - Python библиотека, примеры использования

BeautifulSoup — примеры использования

BeautifulSoup является библиотекой Python для парсинга HTML и XML документов. Часто используется для скрапинга веб-страниц. BeautifulSoup позволяет трансформировать сложный HTML-документ в сложное древо различных объектов Python. Это могут быть теги, навигация или комментарии.

Установка BeautifulSoup в Python

Для установки необходимых модулей используется команда pip3.

$ sudo pip3 install lxml

Для начала требуется установить lxml модуль, который используется в BeautifulSoup.

$ sudo pip3 install bs4

BeautifulSoup устанавливается при помощи использования указанной выше команды.

Пример HTML-кода страницы

В последующих примерах будет использован данный HTML-файл:

<!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 модуль для получения трех тегов.

#!/usr/bin/python3

from bs4 import BeautifulSoup

with open("index.html", "r") as f:
    
    contents = f.read()

    soup = BeautifulSoup(contents, 'lxml')

    print(soup.h2)
    print(soup.head)
    print(soup.li)

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

from bs4 import BeautifulSoup

Здесь производится импорт класса BeautifulSoup из модуля bs4. Таким образом, BeautifulSoup является главным рабочим классом.

with open("index.html", "r") as f:
    
    contents = f.read()

Открывается файл index.html и производится чтение его содержимого при помощи метода read().

soup = BeautifulSoup(contents, 'lxml')

Создается объект BeautifulSoup. Данные передаются конструктору. Вторая опция уточняет объект парсинга.

print(soup.h2)
print(soup.head)

Далее выводится HTML-код следующих двух тегов: h2 и head.

print(soup.li)

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

$ ./simple.py 
<h2>Operating systems</h2>
<head>
<title>Header</title>
<meta charset="utf-8"/>
</head>
<li>Solaris</li>

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

BeautifulSoup теги, атрибуты name и text

Атрибут name указывает на название тега, а атрибут text указывает на его содержимое.

#!/usr/bin/python3

from bs4 import BeautifulSoup

with open("index.html", "r") as f:
    
    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 тега.

$ ./tags_names.py 
HTML: <h2>Operating systems</h2>, name: h2, text: Operating systems

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

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

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

#!/usr/bin/python3

from bs4 import BeautifulSoup

with open("index.html", "r") as f:
    
    contents = f.read()

    soup = BeautifulSoup(contents, 'lxml')
            
    for child in soup.recursiveChildGenerator():
        
        if child.name:
            
            print(child.name)

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

$ ./traverse_tree.py 
html
head
title
meta
body
h2
ul
li
li
li
li
li
p
p

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

BeautifulSoup атрибут children

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

#!/usr/bin/python3

from bs4 import BeautifulSoup
import requests as req
    
resp = req.get("http://www.something.com")

soup = BeautifulSoup(resp.text, 'lxml')

print(soup.title)
print(soup.title.text)
print(soup.title.parent)

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

resp = req.get("http://www.something.com")

soup = BeautifulSoup(resp.text, 'lxml')

Здесь мы получаем информацию о веб-странице.

print(soup.title)
print(soup.title.text)
print(soup.title.parent)

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

$ ./scraping.py 
<title>Something.</title>
Something.
<head><title>Something.</title></head>

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

BeautifulSoup метод prettify()

При помощи метода prettify() можно добиться того, чтобы HTML-код выглядел аккуратнее.

#!/usr/bin/python3

from bs4 import BeautifulSoup
import requests as req
    
resp = req.get("http://www.something.com")

soup = BeautifulSoup(resp.text, 'lxml')

print(soup.prettify())

Таким образом, мы оптимизируем HTML-код простой веб-страницы.

$ ./prettify.py 
<html>
 <head>
  <title>
   Something.
  </title>
 </head>
 <body>
  Something.
 </body>
</html>

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

BeautifulSoup метод find(), поиск элементов по id

При помощи метода find() можно найти элементы страницы, используя различные опорные параметры, id в том числе.

#!/usr/bin/python3

from bs4 import BeautifulSoup

with open("index.html", "r") as f:
    
    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() можно найти все элементы, которые соответствуют заданным критериям.

В примере показано, как при помощи метода find() найти определенный элемент, а затем, используя метод replace_with(), заменить его содержимое.

BeautifulSoup метод decompose() удаление HTML-тега

Метод decompose() удаляет определенный тег из структуры документа и уничтожает его.

#!/usr/bin/python3

from bs4 import BeautifulSoup

with open("index.html", "r") as f:
    
    contents = f.read()

    soup = BeautifulSoup(contents, 'lxml')

    ptag2 = soup.select_one("p:nth-of-type(2)")
     
    ptag2.decompose()
    
    print(soup.body.prettify())

В данном примере показано, как удалить второй элемент p в документе.

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