我使用curl在debian linux终端发送POST请求并且它正常工作,这是curl命令:
curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/
现在我想通过执行以下命令捕获<textarea>
标记之间的内容:
curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -ioE '<textarea.*>(.*(\n.*)*)<\/textarea>'
但它什么也没有回报。我测试了正则表达式并且它正常工作:
正则表达式或grep语法有问题吗?
答案 0 :(得分:2)
由于关键HTTP请求的结果是HTML文档,正确的方法是应用xml / html解析器。
xmllint
就是其中之一:
curl -d "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ \
| xmllint --html --xpath '//textarea/text()' - 2>/dev/null
输出:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=1.12 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=61 time=1.05 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=61 time=1.14 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 1.052/1.107/1.144/0.039 ms
答案 1 :(得分:0)
默认情况下,grep每行单独解析输入,并且textarea中包含换行符,因此你的正则表达式不起作用。但你可以(ab)使用--null-data
参数,然后它会将输入分隔为NULL字节而不是换行符,并且因为你的textarea中没有空字节,所以它可以工作!
curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -ioE '<textarea.*>(.*(\n.*)*)<\/textarea>' --null-data
(但我建议使用正确的HTML解析器,@ RomanPerekhrest推荐的xmllint可能是更好的解决方案,如果你可以使用的话)