【问题标题】:Run curl command on each line of a file and fetch data from result在文件的每一行上运行 curl 命令并从结果中获取数据
【发布时间】:2014-04-27 13:05:39
【问题描述】:

假设我有一个包含网页链接列表的文件。

www.xyz.com/asdd
www.wer.com/asdas
www.asdas.com/asd
www.asd.com/asdas

我知道 curl www.xyz.com/asdd 会为我获取该网页的 html。我想从那个网页获取一些数据。

所以场景是使用 curl 逐个点击文件中的所有链接,并从网页中提取一些数据并存储在其他地方。任何想法或建议。

【问题讨论】:

  • 你熟悉while read line; do curl "$line"; done < your_file吗?它将遍历每一行和curl。对于其余的要求,您的意思不是很清楚。
  • use curl to hit all the links in the file 你必须先解析文件。
  • @fedorqui 在点击每一行之后我想使用正则表达式提取页面的标题可能是
  • 这是另一个问题。你试过什么?
  • ooo @fedorqui 您的命令为我完成了这项工作,非常感谢。添加它作为我会接受的答案

标签: regex bash curl awk


【解决方案1】:

您只需使用xargs 即可完成此操作。假设您在工作目录中有一个包含所有 URL(每行一个)的文件,名为 sitemap

xargs -I{} curl -s {} <sitemap | grep title

这将提取其中包含“标题”一词的任何行。要提取标题标签,您需要稍微更改grep-o 标志确保只打印 grepped 结果:

xargs -I{} curl -s {} <sitemap | grep -o "<title>.*</title>"

有几点需要注意:
  • 如果你想提取某些数据,你需要\转义字符。
    • 例如,对于 HTML 属性,您应该匹配单引号和双引号,并将它们转义为 [\"\']
  • 有时,根据字符集,您可能会得到一些带有特殊字符的不寻常的curl 输出。如果检测到这一点,则需要使用 iconv 之类的实用程序切换编码

【讨论】:

    【解决方案2】:

    如 cmets 所示,这将循环通过 your_filecurl 每一行:

    while IFS= read -r line
    do
       curl "$line"
    done < your_file
    

    要获得一个页面的&lt;title&gt;,你可以grep这样的东西:

    grep -iPo '(?<=<title>).*(?=</title>)' file
    

    所以你可以一起做

    while IFS= read -r line
    do
       curl -s "$line" | grep -Po '(?<=<title>).*(?=</title>)'
    done < your_file
    

    注意curl -s 用于静音模式。看一个谷歌页面的例子:

    $ curl -s http://www.google.com | grep -Po '(?<=<title>).*(?=</title>)'
    302 Moved
    

    【讨论】:

    • -P 在 grep 中有什么作用?
    • -P 允许grep 执行Perl 正则表达式,就像我用来匹配&lt;title&gt;&lt;/title&gt; 之间的字符串的那个。您可以在regular-expressions.info/lookaround.html 了解更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多