Приготовление супа



Успешный 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)


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: