我想知道如何提取HTML中超链接的内容,
例如:
<article id="post36">
<div>
<h3><a href="/blog/2019/4-14-canaries-in-the-coal-mine.html">Canaries in the Coal Mine</a></h3>
<p class="author">Posted by <a href="/blog/authors/moderator.html" rel="author">Moderator</a></p>
<p><time><span>Sunday, April 14th, 2019</span> — 8:17AM</time></p>
</div>
其他帖子看起来像这样(没有外部页面):
<article id="post33">
<div>
<h3><a href="#post33">Landlines Win Again</a></h3>
<p class="author">Posted by <a href="/blog/authors/moderator.html" rel="author">Moderator</a></p>
<p><time><span>Friday, December 21st, 2018</span> — 7:14AM</time></p>
在外部脚本中,我传递了特定帖子的ID。在这种情况下,帖子36在下面。我有一个页面,其中包含文章标签中的所有帖子元数据,如下所示。
我尝试使用添加网页样式(我有本地副本)并将其通过管道传递到sed -n 's|[^<]*<article\([^<]*\)</article>[^<]*|\1\n|gp'
这类作品。它仅返回所有文章ID,如下所示:
<article id="post6">
<article id="post5">
<article id="post4">
<article id="post3">
<article id="post2">
<article id="post1">
我的结论是,它仅适用于当前行。当我尝试实际使用ID时,我什么也没得到:sed -n 's|[^<]*<article id="post36">\([^<]*\)</article>[^<]*|\1\n|gp'
我的问题是如何利用内置的Unix工具(sed,grep,awk等)提取超链接?在这种情况下,我需要的是/blog/2019/4-14-canaries-in-the-coal-mine.html
是的,我已经咨询了许多诸如this one和this one之类的SO职位,其中大多数都不鼓励这种事情(我尝试了本机解决方案,但没有一个可行)。两件事:
答案 0 :(得分:1)
您可以使用sed addresses来选择有趣的行。在这种情况下,使用正则表达式模式来匹配<a href
sed -nre '/h3.*href.*(#post[0-9]+|\/blog\/)/ s/.*<a href="([^"]+)".*/\1/p' test.html
/blog/2019/4-14-canaries-in-the-coal-mine.html
#post33
要按文章ID进行匹配,请将其添加到sed
命令的前面
grep -A3 'article id="post36"' test.html | sed -nre '/h3.*href.*(#post[0-9]+|\/blog\/)/ s/.*<a href="([^"]+)".*/\1/p'