我在HTML中看起来像这样的页面分页:
<span class="nav">Go to <b>1</b>, <a href="page-2.html">2</a>, <a href="page-3.html">3</a>, <a href="page-4.html">4</a>, <a href="page-5.html">5</a> <a href="page-2.html">Next</a></span>
我想得的是最后一页的编号(在本例中为“5”)。我怎么能在Bash中做到这一点?谢谢你的帮助。
答案 0 :(得分:2)
作为一种解决方案,仅考虑作为与<span class="nav">
内部链接相关联的文本的数字(假设in.html
为输入文件):
xmllint --html --xmlout - <in.html \
| xmlstarlet sel -t -m '//span[@class="nav"]//a' -v 'text()' -n \
| egrep '^[[:digit:]]+$' \
| sort -n \
| tail -n 1
这使用xmllint
(包含在现代Linux发行版中)将您的HTML转换为XML,XMLStarlet(并非总是包含在内,但generally packaged {{3} } for common)搜索该XML。
答案 1 :(得分:1)
如果文本中只有数字页面只有数字,那么你可以像下面这样做
egrep '[0-9]+' -o | sort -r -n | head -1
它将匹配文本中的数字,而不是对其进行排序并取第一个(最高)。您可以根据需要修改正则表达式,以便更具体。使用BeautifulSoup4在python中可以实现更好的方法,您可以像在jQuery中一样遍历DOM。
编辑将-n
添加到命令(+1 @CharlesDuffy)
答案 2 :(得分:1)
这假设HTML始终符合您的输入:
sed 's/page-/\n/g' | sort -n | tail -1 | sed 's/.html.*//'
(sed 's/page-/\n/g'
在页码前面添加一个换行符。sort -n
按数字排序;不以页码开头的行排在最前面。tail -1
选择一行最高页码和sed 's/.html.*//'
剥离所有非页面编号的东西)