Успешный web-парсинг сложно реализовать без понимания, как работает HTML. Под данным термином принято подразумевать извлечение нужного набора данных с определенной интернет-страницы. Однако парсер должен предварительно подготовить содержимое страницы – передать исходный код HTML в конструктор BeautifulSoup.
Передача файла с разметкой HTML
Может возникнуть необходимость сохранить внешнюю страницу в виде локального файла. Такая возможность особенно полезна на этапе отладки скрипта, нет необходимости постоянно отправлять запросы к сайту, рискуя получить блокировку.
from bs4 import BeautifulSoup import requests import lxml # Пример 1. Передача файла HTML напрямую без использования менеджера контекста file = open('index.html', encoding='utf-8') soup = BeautifulSoup(file, 'lxml') file.close() print("Анализ файла без использования менеджера контекста:\n", soup) # Пример 2. Передача файла HTML с использованием менеджера контекста with open('index.html', 'r', encoding='utf-8') as file: soup2 = BeautifulSoup(file, 'lxml') print("Анализ файла с использованием менеджера контекста:\n", soup2)
Вариант с менеджером контекста предпочтительнее, поскольку обеспечивается автоматическое закрытие файла после использования.
Далее будет подробнее разобрана строка:
soup = BeautifulSoup(file, 'lxml')
Строка обеспечивает создание экземпляра класса BeautifulSoup, который является частью библиотеки.
file – в Python при открытии файла при помощи функции open() возвращается файловый объект, который иногда называют «файловым дескриптором». Такой объект предоставляет методы для записи, чтения и управления файлом на более высоком уровне.
‘lxml’ – данный параметр указывает на парсер, который будет использоваться для анализа.
Передача объекта response.text
Для парсинга в реальном времени, когда данные извлекаются непосредственно с веб-сайта, используется следующий подход:
from bs4 import BeautifulSoup import requests import lxml # Пример 3. Передача объекта response прямо из запроса response = requests.get(url='https://mob25.com') soup = BeautifulSoup(response.text, 'lxml') print(soup)
Данная схема используется чаще всего. Сразу совершается get-запрос для загрузки актуальной версии страницы, далее результат запроса передается в конструктов BeautifulSoup. Стоит обратить внимание на метод .text, который применяется к объекту response. Такое преобразование необходимо, поскольку конструктор BeautifulSoup может работать только с форматом HTML, поэтому исходный объект response в текст. Если не использовать данную конструкцию, будет сгенерирована ошибка:
TypeError: object of type ‘Response’ has no len()
Если возникают проблемы с кодировкой (выводится непонятный набор символов), необходимо явно указать ее:
response.encoding = 'utf-8' from bs4 import BeautifulSoup import requests import lxml # Пример 3. Передача объекта response прямо из запроса response = requests.get(url='https://mob25.com') response.encoding= 'utf-8' soup = BeautifulSoup(response.text, 'lxml') print(soup)