【问题标题】:How to search through links and save only those that contain a specific data?如何搜索链接并仅保存包含特定数据的链接?
【发布时间】:2018-02-04 22:17:38
【问题描述】:

我在名为 mylinks.txt 的文件中有一个包含数千个格式为“URL = http://examplelink.com”的超链接的文本文件。

我想做的是搜索所有这些链接,并检查其中是否包含一些关键字,例如“2018”、“2017”。如果链接包含关键字,我想将链接保存在文件“yes.txt”中,如果没有,则转到文件“no.txt”。

所以最后,我会得到两个文件:一个包含将我发送到包含我正在搜索的关键字的页面的链接,另一个包含没有的链接。

我正在考虑用 curl 来做这件事,但我不知道是否可行,我也不知道如何按关键字“过滤”链接。

到目前为止我得到的是:

curl -K mylinks.txt >> output.txt

但这只会创建一个超大文件,其中包含它搜索的链接的 HTML。 我已经搜索并阅读了各种 curl 教程,但没有找到任何“选择性”搜索页面并保存它找到的符合条件的页面的链接(而不是内容)。

【问题讨论】:

  • 检查其中是否包含一些关键字 - 你的意思是href 值或链接的文本值?
  • 请提供几行mylinks.txt的样本。
  • 学习在 python 中编写脚本......更多的收益和控制。可能默认安装在您的 linux/unix 机器上。此外,Cryptopat 要求添加。这使问题更具实体性,并且更有可能生存并满足发布问题的最低规则。还要检查 mcve 等的灰色圆圈问号。审核结束。

标签: bash curl


【解决方案1】:

-未经测试- 对于包含“2017”或“2018”的行中的链接。

cat mylinks.txt | grep -E '2017|2018' | grep -o 'URL =*>' >> yes.txt

获取不包含关键字的行的url。

cat mylinks.txt | grep -vE '2017|2018' | grep -o 'URL =*>' >> no.txt

这是 unix 管道。 (字符 | )将左侧的程序输出 stdout 并将 stdin 提供给右侧的程序。

在类 Unix 计算机操作系统中,管道是一系列 由它们的标准流链接在一起的进程,因此 每个进程的输出 (stdout) 直接作为输入 (stdin) 馈送到 下一个。 https://en.wikipedia.org/wiki/Pipeline_(Unix)

【讨论】:

  • 如果没有,它会转到文件“no.txt”。 所以最后,我会结束有两个文件:一个包含将我发送到包含我正在搜索的关键字的页面的链接,另一个包含没有的链接。
【解决方案2】:

这是我的看法(在 url 文件上进行了测试,并带有一些示例)。 这应该是保存为脚本,直接在控制台输入太长了。

#!/bin/bash
urlFile="/path/to/myLinks.txt"
cut -d' ' -f3 "$urlFile" | \
while read url
do
  echo "checking url $url"
  if (curl "$url" | grep "2017") 
  then 
    echo "$url" >> /tmp/yes.txt
  else 
    echo "$url" >> /tmp/no.txt
  fi
done

说明:cut 是必要的,以删除每行中的前缀“URL =”。然后将 url 送入while-read 循环。对于每个 url,我们 curl 它,grep 用于其中的有趣关键字(在本例中为“2017”),如果 grep 返回 0,我们将此 URL 附加到包含有趣 URL 的文件中.

显然,您应该调整路径和关键字。

【讨论】:

  • 感谢您的回复!该解决方案确实可行,但由于某种原因,我得到的链接无法使用 curl。我得到了我需要的东西,方法是使用 wget 保存链接的所有 html 页面,然后在保存页面的整个文件夹上执行“grep”,将文件名保存在“是”或“否”txt 中。跨度>
  • 我已经在几个不需要任何登录的页面上对其进行了测试,它与curl 一起工作。如果您想了解为什么它适用于 wget 而不适用于 curl,您可能想看看 this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多