DE EN ES FR ID JA KO PT RU TH VI ZH

Справочник расширенного API Cheerio

Этот справочник охватывает расширенные методы, утилиты, параметры конфигурации и типы, которые выходят за рамки основной функциональности Cheerio.

Расширенные методы загрузки

loadBuffer(buffer, options?)

Загружает HTML/XML из Buffer с автоматическим определением кодировки.

loadBuffer(buffer: Buffer, options?: DecodeStreamOptions): CheerioAPI

Параметры:

Пример:

import * as cheerio from 'cheerio';
import * as fs from 'fs';

const buffer = fs.readFileSync('index.html');
const $ = cheerio.loadBuffer(buffer);

console.log($('title').text());

Определение кодировки:

const $ = cheerio.loadBuffer(buffer, {
  encoding: {
    defaultEncoding: 'utf8',
    transportLayerEncodingLabel: 'windows-1252'
  }
});

fromURL(url, options?)

Загружает HTML/XML напрямую с URL со встроенным HTTP-клиентом.

fromURL(url: string | URL, options?: CheerioRequestOptions): Promise<CheerioAPI>

Параметры:

Пример:

const $ = await cheerio.fromURL('https://example.com');
console.log($('h1').text());

// With custom headers and options
const $page = await cheerio.fromURL('https://api.example.com/data', {
  requestOptions: {
    headers: { 'User-Agent': 'MyBot/1.0' },
    method: 'GET'
  },
  xmlMode: false,
  baseURI: 'https://api.example.com'
});

Обработка ошибок:

try {
  const $ = await cheerio.fromURL('https://invalid-url.com');
} catch (error) {
  if (error instanceof undici.errors.ResponseError) {
    console.log(`HTTP ${error.statusCode}: Request failed`);
  }
}

stringStream(options, callback)

Создает записываемый поток для парсинга фрагментов HTML/XML.

stringStream(
  options: CheerioOptions,
  cb: (err: Error | null, $: CheerioAPI) => void
): Writable

Пример:

import * as fs from 'fs';

const writeStream = cheerio.stringStream({}, (err, $) => {
  if (err) throw err;
  console.log($('title').text());
});

fs.createReadStream('large-file.html', { encoding: 'utf8' })
  .pipe(writeStream);

Извлечение данных

.extract(map)

Извлекает несколько значений из элементов, используя декларативное отображение.

extract<M extends ExtractMap>(map: M): ExtractedMap<M>

Базовое извлечение:

const $ = cheerio.load(`
  <div>
    <h1 class="title">Welcome</h1>
    <p class="content">Hello world</p>
    <a href="/page" class="link">Click here</a>
  </div>
`);

const data = $.extract({
  title: 'h1.title',
  content: '.content',
  link: '.link'
});
// Result: { title: 'Welcome', content: 'Hello world', link: 'Click here' }

Извлечение массивов:

const $ = cheerio.load(`
  <ul>
    <li class="item">Item 1</li>
    <li class="item">Item 2</li>
    <li class="item">Item 3</li>
  </ul>
`);

const data = $.extract({
  items: ['.item'] // Array syntax for multiple elements
});
// Result: { items: ['Item 1', 'Item 2', 'Item 3'] }

Расширенное извлечение с пользовательскими свойствами:

const data = $.extract({
  links: [{
    selector: 'a',
    value: 'href' // Extract href attribute instead of text
  }],
  metadata: {
    selector: 'head',
    value: {
      title: 'title',
      description: 'meta[name="description"]'
    }
  }
});

Пользовательские функции извлечения:

const data = $.extract({
  wordCount: {
    selector: 'p',
    value: (el, key) => $(el).text().split(' ').length
  },
  processedContent: {
    selector: '.content',
    value: (el) => $(el).text().toUpperCase().trim()
  }
});

Работа с формами

.serialize()

Кодирует элементы формы как строку в URL-кодировке.

serialize(): string

Пример:

const $ = cheerio.load(`
  <form>
    <input name="username" value="john_doe" />
    <input name="email" value="john@example.com" />
    <select name="country">
      <option value="us" selected>United States</option>
      <option value="ca">Canada</option>
    </select>
  </form>
`);

const serialized = $('form').serialize();
// Result: "username=john_doe&email=john%40example.com&country=us"

.serializeArray()

Кодирует элементы формы как массив пар имя-значение.

serializeArray(): Array<{ name: string; value: string }>

Пример:

const data = $('form').serializeArray();
// Result: [
//   { name: 'username', value: 'john_doe' },
//   { name: 'email', value: 'john@example.com' },
//   { name: 'country', value: 'us' }
// ]

Сложные формы:

const $ = cheerio.load(`
  <form>
    <input name="tags" value="javascript" type="checkbox" checked />
    <input name="tags" value="nodejs" type="checkbox" checked />
    <textarea name="comment">Great article!</textarea>
  </form>
`);

const formData = $('form').serializeArray();
// Handles multiple values, textareas, and checkboxes automatically

Расширенные CSS методы

.css() Расширенное использование

Установка на основе функций:

$('div').css('width', function(index, currentValue) {
  return (parseInt(currentValue) || 0) + 10 + 'px';
});

Массовые операции:

$('p').css({
  'font-size': '14px',
  'line-height': '1.5',
  'margin-bottom': '1em'
});

Получение на основе массивов:

const styles = $('header').css(['color', 'background-color', 'font-size']);
// Returns object with requested properties

Расширенная манипуляция

.wrap() с функциями

Динамическое обертывание:

$('img').wrap(function(index) {
  const src = $(this).attr('src');
  return `<figure class="image-${index}">`;
});

.wrapAll() и .wrapInner()

Обертывание нескольких элементов:

$('.related-posts').wrapAll('<section class="sidebar">');

Обертывание внутреннего содержимого:

$('blockquote').wrapInner('<div class="quote-content">');

.unwrap() с селекторами

Условное разворачивание:

$('span').unwrap('.temporary-wrapper'); // Only unwrap from .temporary-wrapper
$('em').unwrap(); // Unwrap from any parent

Расширенные свойства и атрибуты

.prop() Особые случаи

Разрешение URL:

const $ = cheerio.load('<a href="page.html">Link</a>', {
  baseURI: 'https://example.com/blog/'
});

console.log($('a').prop('href')); // 'https://example.com/blog/page.html'

DOM-свойства:

const $input = $('<input type="checkbox" checked>');
console.log($input.prop('checked')); // true
console.log($input.attr('checked')); // 'checked'

$input.prop('checked', false);
console.log($input.attr('checked')); // undefined (removed)

.data() Расширенные функции

Приведение типов:

const $ = cheerio.load(`
  <div 
    data-count="42"
    data-active="true"
    data-config='{"theme": "dark"}'
    data-list="[1,2,3]"
    data-empty="null"
  ></div>
`);

const data = $('div').data();
// Result: {
//   count: 42,           // number
//   active: true,        // boolean
//   config: {theme: "dark"}, // object
//   list: [1,2,3],       // array
//   empty: null          // null
// }

Преобразование в верблюжий регистр:

<div data-user-name="john" data-user-id="123"></div>

$('div').data('userName'); // "john"
$('div').data('userId');   // "123"

Параметры конфигурации

Интерфейс CheerioOptions

interface CheerioOptions {
  xmlMode?: boolean;
  decodeEntities?: boolean;
  lowerCaseAttributeNames?: boolean;
  recognizeSelfClosing?: boolean;
  recognizeCDATA?: boolean;
  baseURI?: string;
  _useHtmlParser2?: boolean;
}

Режим XML:

const $ = cheerio.load(xmlString, {
  xmlMode: true,
  recognizeSelfClosing: true
});

Обработка HTML-сущностей:

const $ = cheerio.load(html, {
  decodeEntities: false // Keep entities as-is
});

Базовый URI для разрешения ссылок:

const $ = cheerio.load(html, {
  baseURI: 'https://example.com/articles/'
});

$('a').each((i, el) => {
  console.log($(el).prop('href')); // Resolves relative URLs
});

HTMLParser2Options

interface HTMLParser2Options {
  lowerCaseAttributeNames?: boolean;
  recognizeSelfClosing?: boolean;
  recognizeCDATA?: boolean;
  xmlMode?: boolean;
  decodeEntities?: boolean;
}

Типы TypeScript

Базовые типы

import type { 
  CheerioAPI, 
  Cheerio, 
  Element, 
  AnyNode,
  CheerioOptions 
} from 'cheerio';

// Custom element processing
function processElements(elements: Cheerio<Element>) {
  elements.each((index, element) => {
    if (element.tagName === 'img') {
      // Process images
    }
  });
}

Расширенное использование типов

// Type-safe extraction
interface ArticleData {
  title: string;
  author: string;
  publishDate: string;
  tags: string[];
}

function extractArticle($: CheerioAPI): ArticleData {
  return $.extract({
    title: 'h1',
    author: '.author',
    publishDate: '.date',
    tags: ['.tag']
  }) as ArticleData;
}

Утилитарные функции

Статические методы

import { contains, merge } from 'cheerio';

// Check if one element contains another
const isContained = contains(parentElement, childElement);

// Merge multiple Cheerio objects
const combined = merge($('.class1'), $('.class2'));

Обработка ошибок и крайние случаи

Изящная деградация

function safeExtract($: CheerioAPI) {
  try {
    return $.extract({
      title: 'h1',
      content: '.content'
    });
  } catch (error) {
    console.warn('Extraction failed:', error);
    return { title: undefined, content: undefined };
  }
}

Пустые коллекции

const $empty = $('.nonexistent');
console.log($empty.length); // 0
console.log($empty.text());  // ""
console.log($empty.attr('class')); // undefined

// Chaining still works
$empty.addClass('test').removeClass('other'); // No-op, returns $empty

Соображения по памяти

// For large documents, consider streaming
const stream = cheerio.stringStream({ xmlMode: true }, (err, $) => {
  if (err) throw err;
  
  // Process document
  const data = $.extract({ /* ... */ });
  
  // Clean up if needed
  $ = null;
});

Этот справочник расширенного API охватывает расширенную функциональность Cheerio за пределами базовой манипуляции DOM, предоставляя мощные инструменты для извлечения данных, работы с формами, потокового ввода-вывода и типобезопасных операций.