如何从curl结果中获取编号最高的链接?

时间:2016-04-21 00:52:03

标签: bash curl

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

似乎有许多路线可以采取,但我无法到达那里......

我有一些卷曲的结果,包括不同的链接在内的大量未使用的数据,并且在所有数据之间有一堆类似的链接 我只需要获得(变量)最高数字的链接(没有始终相同的文本)

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脚本运行的代码都是oke ... 感谢...

更新

我找到了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标签的链接,如:

    &LT; a href =“https://always/same/link/same-name_17.html”&gt;始终相同的文字&lt; / A&GT;

  2. 然后过滤掉所有未结束的内容(“&gt;始终相同的文字&lt; / a&gt;”)
  3. 然后使用如下所述的grep排序。

2 个答案:

答案 0 :(得分:3)

继续发表评论,您可以使用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'"

(同一行续篇。)

答案 1 :(得分:1)

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

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

input-format参数确保您在txt文件的开头和结尾不需要任何html标记。

如果我没弄错的话,在最新的Xidel中,-q(安静)param被-s(无声)取代。