假设我有一个包含网页链接列表的文件。
www.xyz.com/asdd
www.wer.com/asdas
www.asdas.com/asd
www.asd.com/asdas
我知道执行curl www.xyz.com/asdd
将获取该网页的HTML。我想从该网页中获取一些数据。
所以场景是使用curl依次点击文件中的所有链接,并从网页中提取一些数据并存储在其他地方。有任何想法或建议吗?
正如评论所指出的那样,这将循环遍历your_file
并对每一行进行curl
操作:
while IFS= read -r line
do
curl "$line"
done < your_file
要获取页面的<title>
,可以使用类似以下命令的 grep
:
grep "<title>" file.html
grep -iPo '(?<=<title>).*(?=</title>)' file
所以总的来说,你可以这样做
while IFS= read -r line
do
curl -s "$line" | grep -Po '(?<=<title>).*(?=</title>)'
done < your_file
请注意,curl -s
是指静默模式。以下是使用Google页面的示例:
$ curl -s http://www.google.com | grep -Po '(?<=<title>).*(?=</title>)'
302 Moved
-P
允许 grep
执行 Perl 正则表达式,就像我用来匹配 <title>
和 </title>
之间字符串的那个。你可以在 http://www.regular-expressions.info/lookaround.html 上了解更多相关信息。 - fedorquicurl -O "$line"
命令出现了curl: Failed to extract a sensible file name from the URL to use for storage!
和curl: (3) URL using bad/illegal format or missing URL
等错误信息,而且你感到头痛不已,那么请检查源文件中的行尾符号(我的文本文件设置为CRLF时解析正常,设置为LF后也可以正常解析)。 - undefinedxargs
来仅使用一行代码完成此操作。假设您在工作目录中有一个名为sitemap
的文件,其中包含所有URL(每行一个)。
xargs -I{} curl -s {} <sitemap | grep title
这将提取任何包含单词"title"的行。要提取标题标签,您需要稍微更改grep
。 -o
标志确保仅打印出匹配结果:
xargs -I{} curl -s {} <sitemap | grep -o "<title>.*</title>"
如果您想提取某些数据,则需要\
转义字符。curl
输出。 如果检测到这种情况,则需要使用像iconv
这样的实用程序切换编码。
while read line; do curl "$line"; done < your_file
这个命令吗? 它会循环读取每一行并对每一行运行curl
命令。关于其他要求,你的意思不是很清楚。 - fedorqui