Как извлечь URL-адреса и заголовки видео из OK.ru/video с помощью CLI

РЕДАКТИРОВАТЬ 1: Я хотел бы извлечь URL-адреса и заголовки видео из результатов " https://ok.ru/video/c1404844 " с помощью интерфейса командной строки.

Вот что я уже сделал:

Шаблон ERE для каждого относительного URL-адреса видео: /video/\d+ а абсолютный URL-адрес видео выглядит так: https://ok.ru$videoRelativeURL

Я могу использовать эту команду для извлечения URL-адресов видео (я использую uniq потому что многие идентификаторы видео появляются 3 раза):

$ curl -s https://ok.ru/video/c1404844 | grep -oP "/video/\d+" | uniq | sed "s|^|https://ok.ru|" | head -5
https://ok.ru/video/1896971373228
https://ok.ru/video/1896971438764
https://ok.ru/video/1896971569836
https://ok.ru/video/1896971635372
https://ok.ru/video/1898415590060

Затем я попытался извлечь видео relativeURLs + title с помощью pup.

РЕДАКТИРОВАТЬ 3: я заменил имя класса video-card_n ellip от video-card_n.ellip. Однакоpup выводит только атрибут второго класса (video-card_n.ellip), странный:

$ curl -s https://ok.ru/video/c1404844 | pup '.video-card_lk attr{href}, .video-card_n.ellip attr{title}' | head -5
Death.in.Paradise.S02E05.WEBRip.x264-ION10
Death.in.Paradise.S02E02.WEBRip.x264-ION10
Death.in.Paradise.S02E04.WEBRip.x264-ION10
Death.in.Paradise.S02E03.WEBRip.x264-ION10
Death.in.Paradise.S02E06.WEBRip.x264-ION10

Это не сработало, поэтому я преобразовал расширенный html в json с помощью этой команды:

$ curl -s https://ok.ru/video/c1404844 | pup 'json{}' > c1404844.json

Теперь я хочу попробовать извлечь title из video-card_n ellip и href из video-card_lkиз полученного файла json с помощью инструмента jq, но я знаю, как использоватьjq довольно.

я бы хотел jq (или pup) для вывода плоского файла: URL-адрес в качестве первого столбца и заголовок в качестве второго столбца.

РЕДАКТИРОВАТЬ 2: Большое спасибо @peak за его помощь в jq!

СДЕЛАННЫЙ:

$ curl -s https://ok.ru/video/c1404844 | pup 'json{}' | jq -r 'recurse | arrays[] | select(.class == "video-card_lk").href,select(.class == "video-card_n ellip").title' | awk '{videoRelativeURL = $0;url="https://ok.ru"gensub("?.*$","",videoRelativeURL); getline title; print url" # "title}' | head
https://ok.ru/video/1898417425068 # Death.in.Paradise.S02E05.WEBRip.x264-ION10
https://ok.ru/video/1898417359532 # Death.in.Paradise.S02E02.WEBRip.x264-ION10
https://ok.ru/video/1898417293996 # Death.in.Paradise.S02E04.WEBRip.x264-ION10
https://ok.ru/video/1898417228460 # Death.in.Paradise.S02E03.WEBRip.x264-ION10
https://ok.ru/video/1898417162924 # Death.in.Paradise.S02E06.WEBRip.x264-ION10
https://ok.ru/video/1898417097388 # Death.in.Paradise.S02E07.WEBRip.x264-ION10
https://ok.ru/video/1898417031852 # Death.in.Paradise.S02E08.WEBRip.x264-ION10
https://ok.ru/video/1898416966316 # Death.in.Paradise.S02E01.WEBRip.x264-ION10
https://ok.ru/video/1898416769708 # Death.in.Paradise.S07E02.The.Stakes.Are.High.WEBRip.x264-ION10
https://ok.ru/video/1898416704172 # Death.in.Paradise.S07E03.Written.in.Murder.WEBRip.x264-ION10
...

2 ответа

Решение

Если вы хотите очистить определенную информацию из HTML-источника, тогда вам не нужны 5 разных инструментов! Пожалуйста, посмотрите xidel. Он может все.

$ xidel -s https://ok.ru/video/c1404844 -e '
  //div[@data-id]/join(
    (
      div[@class="video-card_img-w"]/a/resolve-uri(substring-before(@href,"?")),
      div[@class="video-card_n-w"]/a
    ),
    " # "
  )
'
https://ok.ru/video/1898417425068 # Death.in.Paradise.S02E05.WEBRip.x264-ION10
https://ok.ru/video/1898417359532 # Death.in.Paradise.S02E02.WEBRip.x264-ION10
https://ok.ru/video/1898417293996 # Death.in.Paradise.S02E04.WEBRip.x264-ION10
https://ok.ru/video/1898417228460 # Death.in.Paradise.S02E03.WEBRip.x264-ION10
https://ok.ru/video/1898417162924 # Death.in.Paradise.S02E06.WEBRip.x264-ION10
https://ok.ru/video/1898417097388 # Death.in.Paradise.S02E07.WEBRip.x264-ION10
https://ok.ru/video/1898417031852 # Death.in.Paradise.S02E08.WEBRip.x264-ION10
https://ok.ru/video/1898416966316 # Death.in.Paradise.S02E01.WEBRip.x264-ION10
https://ok.ru/video/1898416769708 # Death.in.Paradise.S07E02.The.Stakes.Are.High.WEBRip.x264-ION10
https://ok.ru/video/1898416704172 # Death.in.Paradise.S07E03.Written.in.Murder.WEBRip.x264-ION10
[...]

После использования pup для преобразования HTML-кода страницы верхнего уровня в JSON следующий фильтр jq создает 24 пары, первые две из которых показаны в разделе "Вывод" ниже:

[ [ .. | arrays[] | select(.class == "video-card_n ellip").title],
  [ .. | arrays[] | select(.class == "video-card_lk").href]]
| transpose

Выход


[
  [
    "Замечательная пара, красивая песня и чудесное исполнение! Золотые голоса!",
    "/video/2406311403450?st._aid=VideoState_open_top"
  ],
  [
    "#СидимДома",
    "/video/1675421949619?st._aid=VideoState_open_top"
  ],
  ...
Другие вопросы по тегам