【问题标题】:Parsing links from html with gawk使用 gawk 解析来自 html 的链接
【发布时间】:2015-04-29 15:15:42
【问题描述】:

我正在尝试获取 googles html,并解析出链接。我使用 curl 获取 html 然后将其传递给 gawk。从 gawk 我使用了 match() 函数,它可以工作,但它只返回少量链接。最多可能10个。如果我在 regex101.com 上测试我的正则表达式,它会使用 g 全局修饰符返回 51 个链接。如何在 gawk 中使用它来获取所有链接(相对和绝对)?

#!/bin/bash

html=$(curl -L "http://google.com")

echo "${html}" | gawk '
  BEGIN {
    RS=" "
    IGNORECASE=1
  }
  {
    match($0, /href=\"([^\"]*)/, array);
    if (length(array[1]) > 0) {
      print array[1];
    }
  }'

【问题讨论】:

    标签: regex bash awk gawk


    【解决方案1】:

    你也可以使用grep -oP代替awk:

    curl -sL "http://google.com" | grep -iPo 'href="\K[^"]+'
    

    不过,这也为我获取了 31 个链接。这可能因您的浏览器而异,因为google.com 为不同的位置/登录用户提供不同的页面。

    【讨论】:

    • 谢谢,但我得到usage: grep 作为输出,但它没有运行?
    • 嗯,您必须使用较旧的 grep。 grep -P 需要更新的 gnu grep
    • 我有 grep (BSD grep) 2.5.1-FreeBSD
    • 嗯,这不是 gnu grep。在 OSX 上,我使用 home brew 来获取 gnu grep。
    • 另外,很可能,谷歌可以在页面加载后使用 ajax 向页面添加更多链接。我建议对于测试,OP 应该只使用一次 curl 将页面下载到磁盘上的文件中。然后用 awk, grep, regex101.com 使用相同的 html 页面内容,看看 OP 是否每次都得到相同的结果。
    【解决方案2】:

    Match 只匹配最左边的匹配,每次都需要更新该行。

    试试

     curl -sL "http://google.com" | gawk '{while(match($0, /href=\"([^\"]+)/, array)){
          $0=substr($0,RSTART+RLENGTH);print array[1]}}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 2010-09-12
      • 2017-06-19
      • 1970-01-01
      • 2010-09-23
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多