使用sed或awk从html页面中提取网址的最简单方法

cod*_*ict 56 html regex bash awk sed

我想从html文件的锚标签中提取URL.这需要使用SED/AWK在BASH中完成.请不要perl.

最简单的方法是什么?

Har*_*rdy 55

你也可以这样做(如果你安装了lynx)......

Lynx版本<2.8.8

lynx -dump -listonly my.html
Run Code Online (Sandbox Code Playgroud)

Lynx版本> = 2.8.8(由@condit提供)

lynx -dump -hiddenlinks=listonly my.html
Run Code Online (Sandbox Code Playgroud)

  • 在Lynx 2.8.8中,这已成为`lynx -dump -hiddenlinks = listonly my.html` (3认同)

Gre*_*con 37

你自找的:

$ wget -O - http://stackoverflow.com | \
  grep -io '<a href=['"'"'"][^"'"'"']*['"'"'"]' | \
  sed -e 's/^<a href=["'"'"']//i' -e 's/["'"'"']$//i'
Run Code Online (Sandbox Code Playgroud)

这是一个粗略的工具,因此所有关于尝试使用正则表达式解析HTML的常见警告都适用.

  • 几乎完美,但是这两种情况呢: 1. 你只匹配以 &lt;a href &lt;a title="Title" href="sample"&gt;Match me&lt;/a&gt; 开头的 2. 如果有两个锚点怎么办在同一行中,我对原始解决方案进行了修改:`code` cat index.html | grep -o '&lt;a .*href=.*&gt;' | sed -e 's/&lt;a/\n&lt;a/g' | sed -e 's/&lt;a/\n&lt;a/g' | sed -e 's/&lt;a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d ' `代码` (2认同)

小智 14

grep "<a href=" sourcepage.html
  |sed "s/<a href/\\n<a href/g" 
  |sed 's/\"/\"><\/a>\n/2'
  |grep href
  |sort |uniq
Run Code Online (Sandbox Code Playgroud)
  1. 第一个grep查找包含url的行.如果您只想查看本地页面,则可以添加更多元素,因此不需要http,而是相对路径.
  2. 第一个sed将使用\n 在每个href url标记前添加换行符
  3. 第二个sed会缩短第二个"在第二行之后的每个网址",用一个换行符替换/ a标签两个seds会在一行上给你每个网址,但是有垃圾,所以
  4. 第二个grep href清除了混乱
  5. sort和uniq将为您提供sourcepage.html中存在的每个现有URL的一个实例


Ing*_*kat 14

使用Xidel - HTML/XML数据提取工具,可以通过以下方式完成:

$ xidel --extract "//a/@href" http://example.com/
Run Code Online (Sandbox Code Playgroud)

转换为绝对网址时:

$ xidel --extract "//a/resolve-uri(@href, base-uri())" http://example.com/
Run Code Online (Sandbox Code Playgroud)


gho*_*g74 12

例如,因为您没有提供任何样本

awk 'BEGIN{
RS="</a>"
IGNORECASE=1
}
{
  for(o=1;o<=NF;o++){
    if ( $o ~ /href/){
      gsub(/.*href=\042/,"",$o)
      gsub(/\042.*/,"",$o)
      print $(o)
    }
  }
}' index.html
Run Code Online (Sandbox Code Playgroud)


Cri*_*oot 10

我对Greg Bacon Solution做了一些改动

cat index.html | grep -o '<a .*href=.*>' | sed -e 's/<a /\n<a /g' | sed -e 's/<a .*href=['"'"'"]//' -e 's/["'"'"'].*$//' -e '/^$/ d'
Run Code Online (Sandbox Code Playgroud)

这解决了两个问题:

  1. 我们正在匹配锚点不以href作为第一个属性开始的情况
  2. 我们正在考虑在同一条线上安装几个锚的可能性


nes*_*983 5

您可以使用以下正则表达式轻松完成此操作,它非常适合查找 URL:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
Run Code Online (Sandbox Code Playgroud)

我取自John Gruber 的关于如何在文本中查找 URL 的文章

这样您就可以找到文件 f.html 中的所有 URL,如下所示:

cat f.html | grep -o \
    -E '\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))'
Run Code Online (Sandbox Code Playgroud)

  • 在 grep 之前你不需要有一只猫。只需将 f.html 放在 grep 的末尾即可 (5认同)
  • 复杂,并且当 href 如下所示时失败: ... HREF="http://www.somewhere.com/" ADD_DATE="1197958879" LAST_MODIFIED="1249591429"&gt; ... (2认同)

Alo*_*hal 5

我假设您想要从某些HTML文本中提取URL,而不是解析HTML(正如其中一条评论所示).信不信由你,有人已经这样做了.

OT:sed网站很多很好的信息和许多有趣/疯狂的sed脚本.你甚至可以 在sed Sokoban!