0

编辑 1:我想使用 CLI从“ https://ok.ru/video/c1404844 ”结果中提取视频网址和标题。

这是我到目前为止所做的事情:

每个视频相对 URL 的 ERE 模式是: /video/\d+视频绝对 URL 如下所示:https://ok.ru$videoRelativeURL

我可以使用这个命令来提取视频 url(我使用uniq是因为很多视频 ID 出现了 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

然后我尝试用pup提取视频 relativeURLs + 标题。

编辑 3:我将类名替换video-card_n ellipvideo-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

现在我想尝试使用jq工具从生成的 json 文件中提取titlefromvideo-card_n elliphreffrom ,但我知道如何使用足够多。video-card_lkjq

我想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
...
4

2 回答 2

1

使用将顶层页面的 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"
  ],
  ...
于 2020-04-17T02:16:39.313 回答
1

如果您想从 HTML 源中抓取特定信息,则不需要 5 种不同的工具!请看看。它可以做到这一切。

$ 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
[...]
于 2020-08-09T19:58:46.357 回答