【问题标题】:How to get the highest numbered link from curl result?如何从 curl 结果中获取最高编号的链接?
【发布时间】:2016-04-21 00:52:02
【问题描述】:

我已经创建了一个由几个 shell 脚本组成的小程序,它们一起工作,几乎完成了 一切似乎都很好,除了我不太确定该怎么做的一件事。 我需要,才能完成这个项目......

似乎有很多路线可以走,但我就是无法到达那里......

我有一些 curl 结果,其中包含许多未使用的数据,包括不同的链接,并且在所有数据之间有一堆相似的链接 我只需要获取(进入变量)最高数字的链接(没有始终相同的文本)

the links are all similar, and have this structure:
<a href="https://always/same/link/same-name_19.html">always same text</a>
<a href="https://always/same/link/same-name_18.html">always same text</a>
<a href="https://always/same/link/same-name_17.html">always same text</a>

我在想类似的事情;

content="$(curl -s "$url/$param")"

linksArray= get from $content all links that are in the href section of the links
that contain "always same text"

declare highestnumber;

for file in $linksArray 
do

href=${1##*/}

fullname=${href%.html}

OIFS="$IFS"
IFS='_'
read -a nameparts <<< "${fullname}"
IFS="$OIFS"

if ${nameparts[1]} > $highestnumber;
then 
highestnumber=${nameparts[1]}
fi

done

echo ${nameparts[1]}_${highestnumber}.html

结果:

https://always/same/link/unique-name_19.html

这只是我的猜测,任何可以从 bash 脚本运行的工作代码都可以... 谢谢...

更新

我找到this nice program,很容易安装:

# 64bit version
wget -O xidel/xidel_0.9-1_amd64.deb https://sourceforge.net/projects/videlibri/files/Xidel/Xidel%200.9/xidel_0.9-1_amd64.deb/download
apt-get -y install libopenssl
apt-get -y install libssl-dev
apt-get -y install libcrypto++9
dpkg -i xidel/xidel_0.9-1_amd64.deb

它看起来棒极了,但我不确定如何根据我的需要调整它。

基于该链接和以下答案,我想可能的解决方案是..

  1. 使用 xidel,或者按照this link 的建议使用“$ sed -n 's/.href="([^"]).*/\1/p' file”,然后对其进行调整以获得带有 html 标签的链接,例如:

    始终相同的文本

  2. 然后过滤掉所有不以 ( ">always same text ) 结尾的内容
  3. 然后使用下面提到的 grep 排序。

【问题讨论】:

  • 为什么不像 thelatest=$(grep -o 'https:.*[.]html' &lt; &lt;(curl -s "$url/$param") | sort | tail -n1) 这样简单?您可以根据需要调整grep正则表达式的特异性。

标签: bash curl


【解决方案1】:

从评论继续,您可以使用grepsorttail 来隔离您的相似链接列表中的最高数量,而不会太麻烦。例如,如果您的链接列表如您所描述(出于示例的目的,我将它们保存在文件dat/links.txt 中),您可以轻松地隔离变量中的最高数字:

示例列表

$ cat dat/links.txt
<a href="https://always/same/link/same-name_19.html">always same text</a>
<a href="https://always/same/link/same-name_18.html">always same text</a>
<a href="https://always/same/link/same-name_17.html">always same text</a>

解析最高编号的链接

$ myvar=$(grep -o 'https:.*[.]html' dat/links.txt | sort | tail -n1); \
echo "myvar : '$myvar'"
myvar : 'https://always/same/link/same-name_19.html'

(注意:上面的命令都是由续行'\'分隔的一行)

直接应用于curl的结果

无论您的列表是在文件中,还是由curl -s 返回,您都可以应用相同的方法来隔离返回列表中编号最高的链接。您可以单独使用带有curl 命令的进程替换,也可以将结果通过管道传送到grep。例如。正如我原来的评论中所述,

$ myvar=$(grep -o 'https:.*[.]html' < <(curl -s "$url/$param") | sort | tail -n1); \
echo "myvar : '$myvar'"

或将curl 的结果通过管道传输到grep

$ myvar=$(curl -s "$url/$param" | grep -o 'https:.*[.]html' | sort | tail -n1); \
echo "myvar : '$myvar'"

(同一行续注。)

【讨论】:

  • 有趣的帖子,当我尝试您的示例时,一切正常,但是当与 curl 结合使用时,我无法让它工作......(对我来说)唯一有意义的是如果grep 是一个逐行工具。并且卷曲的html页面有很多行,然后grep找到正确的行,然后找到“https:”的第一个实例和“html”的最后一个实例,并显示两者之间的所有内容。
  • 您使用的是什么外壳。进程替换(例如&lt; &lt;(curl -s "$url/$param"))在 POSIX shell 中不起作用,但管道版本应该。此外,任何特定 URL 返回的内容的变化可能需要对正则表达式进行调整(特别是如果一行中有多个 .html
  • 我不确定它是否能回答您的问题,但我正在使用带有默认 shell 的 Debian Jessie。我都试过了,但巧合的是,大多数人都尝试了管道版本。 p.s.我更新了我的问题。
【解决方案2】:

为什么不使用 Xidel 和 xquery 对链接进行排序并返回最后一个?

xidel -q links.txt --xquery "(for $i in //@href order by $i return $i)[last()]" --input-format xml

输入格式参数确保您在 txt 文件的开头和结尾不需要任何 html 标记。

如果我没记错的话,在最新的 Xidel 中,-q(安静)参数被替换为 -s(静音)。

【讨论】:

  • 将我的问题中给出的 3 个链接放入 links.txt 并运行给定行时,我得到一个错误:err:XPST0003: Unknown or unexpected operator: in in: (for [ 发生在 here 之前]
  • 如果你使用Linux,将双引号换成单引号。
猜你喜欢
  • 1970-01-01
  • 2022-01-01
  • 2015-02-09
  • 2018-08-04
  • 1970-01-01
  • 2017-06-02
  • 2015-07-27
  • 1970-01-01
  • 2015-03-21
相关资源
最近更新 更多