Skip to content

Извлечение медиа на практике

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

Обзор извлечения

При вызове Extract извлечение видео и аудио выполняется после разбора DOM, но до форматирования контента. Результаты помещаются в Result.Videos и Result.Audios соответственно.

text
Разбор DOM → извлечение видео (3 источника) → извлечение аудио (2 источника) → форматирование → Result

Извлечение видео (три источника)

Извлечение видео выполняется в следующем порядке, каждый URL дедуплицируется и не попадает в результат дважды:

ПорядокИсточникОбъект сканированияОписание
Сканирование исходного HTMLатрибуты src/data у iframe/embed/objectвыполняется до безопасного санирования, чтобы очищаемые встраиваемые теги не потерялись
Обход DOMэлементы video/iframe/embed/objectобход разобранного DOM-дерева, чтение атрибутов элементов и дочерних <source>
Регулярные выражения (резерв)URL видеофайловсканирование «голых» ссылок на видео в тексте HTML

Зачем сканировать исходный HTML

Встраиваемые теги iframe, embed, object могут быть удалены на этапе безопасного санирования. Библиотека извлекает медиа-URL этих тегов из исходной строки HTML до санирования, чтобы встраиваемые видео не потерялись при очистке.

Расширения видео для резервного поиска через регулярные выражения

.mp4  .webm  .ogg  .mov  .avi  .wmv  .flv  .mkv  .m4v  .3gp

Регулярное выражение совпадает только с полными URL, начинающимися с http:// или https://, что исключает ложные совпадения с фрагментами имён файлов.

Извлечение аудио (два источника)

ПорядокИсточникОбъект сканированияОписание
Обход DOMэлемент audio и его дочерние <source>чтение атрибута src или src/type дочернего <source>
Регулярные выражения (резерв)URL аудиофайловсканирование «голых» ссылок на аудио в тексте HTML

Расширения аудио для резервного поиска через регулярные выражения

.mp3  .wav  .ogg  .m4a  .aac  .flac  .wma  .opus  .oga

Расширение .ogg присутствует и в списке видео, и в списке аудио

OGG — это контейнерный формат, который может содержать видео (Theora) или аудио (Vorbis/Opus). URL с расширением .ogg определяется одновременно как видео и как аудио и может оказаться одновременно в Result.Videos и Result.Audios. Вариант только для аудио .oga присутствует только в списке аудио.

Подробное описание полей

VideoInfo

ПолеТипОписание
URLstringURL источника видео
TypestringОпределённый тип: MIME-тип (например video/mp4) или embed (страница, встраиваемая через iframe)
Posterstringатрибут poster у <video> (URL обложки)
Widthstringатрибут ширины (исходная строка, не преобразуется в число)
Heightstringатрибут высоты (исходная строка, не преобразуется в число)
Durationstringатрибут длительности (исходная строка, не преобразуется в число)

AudioInfo

ПолеТипОписание
URLstringURL источника аудио
TypestringОпределённый тип: MIME-тип (например audio/mpeg)
Durationstringатрибут длительности (исходная строка, не преобразуется в число)

Правила значений поля Type

Поле Type различает два источника видео:

Значение TypeЗначениеСценарий возникновения
embedстраница с видео по ссылке iframeвстраиваемые плееры YouTube, Vimeo, Youku, Bilibili и т. п.
MIME-тип (например video/mp4)контейнер видеофайла«голый» URL, совпавший с резервным регулярным выражением, или значение атрибута <source type="...">
Пустая строкатип не определёнисточник указан напрямую через <video src="..."> (без дочерних элементов <source>)

Платформы, поддерживающие определение embed:

ПлатформаШаблон URL
YouTubeyoutube.com/embed/, youtube-nocookie.com/embed/
Vimeoplayer.vimeo.com/video/
Dailymotiondailymotion.com/embed/
Youkuplayer.youku.com/
Tencent Videov.qq.com/
Bilibilibilibili.com/

Полный пример

go
package main

import (
    "fmt"
    "log"

    "github.com/cybergodev/html"
)

func main() {
    // HTML с тремя медиа-сценариями:
    // 1. iframe-встраивание YouTube (Type = "embed")
    // 2. Нативное видео с дочерним <source> (Type из атрибута type)
    // 3. Аудио с дочерним <source> (Type из атрибута type)
    data := []byte(`<html><body><article>
        <h1>Мультимедийная страница</h1>
        <p>В этой статье рассказывается о видео- и аудиотехнологиях.</p>
        <iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ" width="560" height="315"></iframe>
        <video poster="poster.jpg" width="640" height="360">
            <source src="https://example.com/trailer.mp4" type="video/mp4">
        </video>
        <audio>
            <source src="https://example.com/episode.mp3" type="audio/mpeg">
        </audio>
    </article></body></html>`)

    result, err := html.Extract(data)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Видео: %d\n", len(result.Videos))
    // Видео: 2

    for i, v := range result.Videos {
        fmt.Printf("  Видео %d: %s\n", i+1, v.URL)
        fmt.Printf("    Type: %s", v.Type)
        if v.Poster != "" {
            fmt.Printf(", обложка: %s", v.Poster)
        }
        if v.Width != "" || v.Height != "" {
            fmt.Printf(", размер: %sx%s", v.Width, v.Height)
        }
        fmt.Println()
    }
    // Видео 1: https://www.youtube.com/embed/dQw4w9WgXcQ
    //   Type: embed, размер: 560x315
    // Видео 2: https://example.com/trailer.mp4
    //   Type: video/mp4, обложка: poster.jpg, размер: 640x360

    fmt.Printf("\nАудио: %d\n", len(result.Audios))
    // Аудио: 1

    for i, a := range result.Audios {
        fmt.Printf("  Аудио %d: %s (Type: %s)\n", i+1, a.URL, a.Type)
    }
    // Аудио 1: https://example.com/episode.mp3 (Type: audio/mpeg)
}

Управление конфигурацией

Параметры Preserve*

Параметры PreserveVideos и PreserveAudios управляют тем, включается ли медиа в результат Extract:

Поле конфигурацииПо умолчаниюДействие
PreserveVideostrueпри false Result.Videos — пустой срез
PreserveAudiostrueпри false Result.Audios — пустой срез
go
cfg := html.DefaultConfig()

// Отключить извлечение видео и аудио (оставить только текст, изображения, ссылки)
cfg.PreserveVideos = false
cfg.PreserveAudios = false

result, err := html.Extract(data, cfg)
// result.Videos → []
// result.Audios → []

Различие между Preserve* и Include*

Эти две группы параметров работают независимо и управляют разными API:

Группа параметровУправляемый APIОписание
PreserveVideos/PreserveAudiosExtractуправляет заполнением Result.Videos/Result.Audios
IncludeVideos/IncludeAudiosExtractAllLinksуправляет включением видео-/аудио-URL в перечисление ссылок

Они независимы

Отключение PreserveVideos не влияет на IncludeVideos в ExtractAllLinks, и наоборот. Настраивайте тот параметр, который соответствует используемому API.

Предустановка производительности TextOnlyConfig

Когда нужен только текст, TextOnlyConfig() уже отключает все параметры Preserve*, ручная настройка не требуется:

go
cfg := html.TextOnlyConfig()
// PreserveImages = false
// PreserveLinks = false
// PreserveVideos = false
// PreserveAudios = false

result, err := html.Extract(data, cfg)
// Пропуск всех медиа, наилучшая производительность

Следующие шаги