← Назад к вопросам

Какие парсеры знаешь?

1.0 Junior🔥 71 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Парсеры в Python

Парсеры используются для анализа и обработки различных форматов данных. В Python существует множество мощных инструментов для парсинга.

1. BeautifulSoup (HTML/XML парсер)

Одна из самых популярных библиотек для парсинга HTML и XML.

from bs4 import BeautifulSoup
import requests

# Парсинг HTML
response = requests.get("https://example.com")
soup = BeautifulSoup(response.content, "html.parser")

# Поиск элементов
title = soup.find("title")
print(title.text)  # Заголовок страницы

# Поиск по классу
articles = soup.find_all("div", class_="article")

# CSS селекторы
headers = soup.select(".header > h1")

# Получение атрибутов
links = soup.find_all("a")
for link in links:
    href = link.get("href")
    text = link.text
    print(f"{text}: {href}")

Преимущества:

  • Простой и интуитивный API
  • Хорошо работает с грязным HTML
  • Поддержка CSS селекторов

Недостатки:

  • Медленнее, чем другие парсеры
  • Не подходит для очень больших файлов

2. Selenium (для JavaScript-heavy сайтов)

Для парсинга динамических сайтов, которые загружают контент через JavaScript.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")

# Ждать загрузки элемента
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "dynamic-content")))

# Парсинг после загрузки
data = driver.find_element(By.ID, "data").text
print(data)

driver.quit()

Преимущества:

  • Работает с динамически загружаемым контентом
  • Поддержка взаимодействия с сайтом (клики, заполнение форм)
  • JavaScript выполняется полностью

Недостатки:

  • Очень медленный
  • Требует большие ресурсы
  • Сложнее настройка

3. lxml (быстрый XML/HTML парсер)

Высокопроизводительный парсер на C, обёртка вокруг libxml2.

from lxml import html
import requests

response = requests.get("https://example.com")
tree = html.fromstring(response.content)

# XPath запросы
titles = tree.xpath("//h1/text()")
links = tree.xpath("//a/@href")

# Более сложный XPath
articles = tree.xpath("//div[@class='article']")
for article in articles:
    title = article.xpath(".//h2/text()")[0]
    description = article.xpath(".//p/text()")[0]
    print(f"{title}: {description}")

Преимущества:

  • Очень быстрый (написан на C)
  • Мощные XPath запросы
  • Низкое потребление памяти

Недостатки:

  • XPath запросы сложнее CSS селекторов
  • Менее прощающий к грязному HTML

4. PyQuery (jQuery-like синтаксис)

Для тех, кто привык к jQuery API.

from pyquery import PyQuery as pq
import requests

response = requests.get("https://example.com")
doc = pq(response.content)

# jQuery-like синтаксис
titles = doc("h1").text()
links = doc("a").attr("href")

# Iteration
for item in doc(".item").items():
    text = item.find("p").text()
    print(text)

5. json парсер (встроенный)

Для работы с JSON данными.

import json

# Парсинг JSON
json_string = '{"name": "John", "age": 30}'
data = json.loads(json_string)
print(data["name"])  # John

# Сохранение в JSON
json_output = json.dumps(data, indent=2)
print(json_output)

# Работа с файлами
with open("data.json", "r") as f:
    data = json.load(f)

with open("data.json", "w") as f:
    json.dump(data, f)

6. csv парсер (встроенный)

Для работы с CSV файлами.

import csv

# Чтение CSV
with open("data.csv", "r") as f:
    reader = csv.DictReader(f)
    for row in reader:
        print(row["name"], row["age"])

# Запись CSV
data = [
    {"name": "John", "age": 30},
    {"name": "Jane", "age": 25}
]

with open("output.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "age"])
    writer.writeheader()
    writer.writerows(data)

7. xml.etree.ElementTree (встроенный XML парсер)

Для работы с XML файлами.

import xml.etree.ElementTree as ET

# Парсинг XML
tree = ET.parse("data.xml")
root = tree.getroot()

# Поиск элементов
for item in root.findall("item"):
    name = item.find("name").text
    value = item.find("value").text
    print(f"{name}: {value}")

# Создание XML
root = ET.Element("root")
item = ET.SubElement(root, "item")
name = ET.SubElement(item, "name")
name.text = "John"

tree = ET.ElementTree(root)
tree.write("output.xml")

8. Scrapy (фреймворк для веб-скрейпинга)

Полноценный фреймворк для крупномасштабного скрейпинга.

import scrapy
from scrapy.crawler import CrawlerProcess

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = ["http://quotes.toscrape.com"]
    
    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {
                "text": quote.css("span.text::text").get(),
                "author": quote.css("small.author::text").get(),
            }
        
        next_page = response.css("li.next a::attr(href)").get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

# Запуск
process = CrawlerProcess({"USER_AGENT": "mybot 1.0"})
process.crawl(QuotesSpider)
process.start()

Преимущества:

  • Мощный фреймворк для крупных проектов
  • Встроенное управление requests, кэширование
  • Поддержка pipelines для обработки данных
  • Встроенный scheduler и middleware

9. Pydantic (для валидации и парсинга структурированных данных)

Для парсинга и валидации JSON/dict.

from pydantic import BaseModel, validator
from typing import List

class User(BaseModel):
    id: int
    name: str
    email: str
    age: int = None
    
    @validator("email")
    def validate_email(cls, v):
        if "@" not in v:
            raise ValueError("Invalid email")
        return v

# Парсинг JSON
json_data = {"id": 1, "name": "John", "email": "john@example.com"}
user = User(**json_data)
print(user)

# Валидация
try:
    invalid_user = User(id=2, name="Jane", email="invalid", age=30)
except ValueError as e:
    print(f"Validation error: {e}")

10. argparse (парсер командной строки)

Для парсинга аргументов командной строки.

import argparse

parser = argparse.ArgumentParser(description="My application")
parser.add_argument("--name", type=str, required=True, help="User name")
parser.add_argument("--age", type=int, default=30, help="User age")
parser.add_argument("--verbose", action="store_true", help="Verbose output")

args = parser.parse_args()
print(f"Name: {args.name}, Age: {args.age}")

if args.verbose:
    print("Verbose mode enabled")

11. YAML парсер (PyYAML)

Для работы с YAML конфигурационными файлами.

import yaml

# Парсинг YAML
with open("config.yaml", "r") as f:
    config = yaml.safe_load(f)

print(config["database"]["host"])

# Создание YAML
data = {
    "name": "John",
    "age": 30,
    "hobbies": ["reading", "coding"]
}

with open("output.yaml", "w") as f:
    yaml.dump(data, f)

Сравнение парсеров

ПарсерНазначениеСкоростьПростотаРекомендуется
BeautifulSoupHTML/XMLСредняяВысокаяБазовый скрейпинг
lxmlHTML/XMLОчень высокаяСредняяПроизводительность
SeleniumДинамический контентНизкаяСредняяJavaScript сайты
ScrapyВеб-скрейпингСредняяНизкаяКрупные проекты
jsonJSONОчень высокаяОчень высокаяAPI данные
csvCSVВысокаяВысокаяТабличные данные
PyYAMLYAMLСредняяВысокаяКонфигурации
PydanticВалидация данныхСредняяВысокаяREST API

Практические рекомендации

  • Для базового скрейпинга: BeautifulSoup
  • Для производительности: lxml
  • Для динамических сайтов: Selenium или Playwright
  • Для больших проектов: Scrapy
  • Для API данных: json + Pydantic
  • Для конфигов: YAML парсер
  • Всегда используй кэширование результатов
  • Помни о robots.txt при скрейпинге
  • Используй User-Agent и задержки между запросами
  • Обрабатывай исключения при парсинге внешних данных
Какие парсеры знаешь? | PrepBro