从包含大量链接的 html 页面中,我正在寻找一种方法来仅提取遵循特定格式的链接。
<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>
我找到了许多使用grep
、sed
和其他解决方案,但它们都只返回内部链接,没有 html 标签和“始终相同的文本”部分。
它应该可以从命令行/bash 脚本运行,我使用的是 Debian Jessie。解决方案不一定是单行的。
更新
我在 Ryan's Answer 的帮助下制作的脚本。
Curl=https://always/same/link/
filename=same-name
page=`curl "$Curl$filename"`
echo $page > $filename.curl
Gurl=https://always/same/link/
# working
link=`grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' $filename.curl | sort | tail -n1`
# not working; $link will be empty
link=`grep -Eo "<a href=\"https://always/same/link/same-name_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1`
# not working; $link will be empty
link=`grep -Eo "<a href=\"${Gurl}${filename}_([0-9]+)\.html\">always same text</a>" $filename.curl | sort | tail -n1`
# what i ended up using.
link=`grep -Eo '<a href="'${Gurl}${filename}'_([0-9]+)\.html\">always same text</a>' $filename.curl | sort | tail -n1`
echo $link | grep -o 'https:.*[.]html'
答案1
假设大多数 href 属性始终相同,并且内部文本始终相同,并且您有一个 HTML 源文件,那么类似这样的操作应该有效:
grep -Eo '<a href="https://always/same/link/same-name_([0-9]+)\.html">always same text</a>' HTML-source-file
grep
将搜索HTML-source-file
给定的模式https://always/same/link/same-name_([0-9]+)\.html
。此模式将匹配由以下元素组成的任何字符串(按顺序):
- https://always/same/link/same-name_
- 0 到 9 中的任意数字
- .html
该-E
标志告诉grep
将模式解释为扩展的正则表达式。
该-o
标志告诉grep
只输出与模式匹配的文本。
要使用变量,可以在正则表达式两边使用双引号,转义双引号里面带反斜杠的正则表达式,并将变量名称括在花括号中,如下所示:
$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo "<a href=\"${link_path}${link_name}_([0-9]+)\.html\">always same text</a>" HTML-source-file
如果由于某种原因,上面的grep
转义双引号不起作用,您也可以使用:
$ link_path=https://always/same/link/
$ link_name=same-name
$ grep -Eo '<a href="'${link_path}${link_name}'_([0-9]+)\.html">always same text</a>' HTML-source-file