我想从网站上获取当前汇率:
<span id="aq_usdpln#1_c5">3.81990</span>
结果应为USD: 3.81
也可以获取此代码,但是它不起作用:
wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0"|awk -F"[ >]" '/<span id="aq_usdpln#1_c5">/ {printf "%s"}'
可以帮助别人并粘贴正确的代码吗? 谢谢
答案 0 :(得分:1)
请您尝试以下。
yor_command | awk -F"[><]" '{printf("USD: %.02f\n",$3)}'
答案 1 :(得分:1)
我发现wget
返回的html(和javascript等)的困难在于,当使用{{1时,它是由148506
个字段组成的一些5007
个字符}}作为文件分隔符。
一种解决方案是遍历每个字段并找到您的-F'[><]'
文本,然后将下一个字段作为浮点值,例如
"span id=aq_usdpln_c5"
使用/输出示例
您只需将以上内容粘贴到终端中,例如
wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" |
awk -F'[><]' '{
for (i = 1; i <= NF; i++)
if ($i == "span id=aq_usdpln_c5")
printf "USD: %.2f\n", $(i+1)
}'
仔细研究一下,如果您有任何疑问,请告诉我。
答案 2 :(得分:0)
您快到了,您错过了 sed 函数调用。 Sed可帮助您解析和转换Shell中的文本。
尝试一下:
wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F ">" '{ print $2 }' | sed 's/<\/span\>//' | awk '{ print substr($0,0,4) }'
3.81
awk -F ">" '{ print $2 }'
在定界符>
上分割文本,并打印第二部分sed 's/<\/span\>//'
用注释替换文本/span>
awk '{ print substr($0,0,4) }'
substr(s,i [,n])返回从i开始的s的最多n个字符的子字符串。如果省略n,则使用s的其余部分。答案 3 :(得分:0)
站点不断变化,它将为不同的位置和不同的UA提供不同的来源。
当我对其进行测试时,返回的源代码不包含ID "aq_usdpln#1_c5"
,而是包含aq_usdpln_c5
,并且ID周围没有引号。
我认为最好先使用GNU grep
,对regex
进行一些概括,然后再输入awk
:
$ wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | grep -oP "span id=.?aq_usdpln(#1)?_c5.?>\K.*?(?=<)"|awk -F. '{printf "USD: %s.%s\n",$1,substr($2,1,2)}'
USD: 3.81
grep的正则表达式span id=.?aq_usdpln(#1)?_c5.?>\K.*?(?=<)
:
.?
用于公开报价,它可能存在或不存在。
与(#1)?
类似,如果存在#1
则兼容。
\K
表示正则表达式将匹配它之前的内容,但仅返回它之后的内容。
.*?
表示匹配所有更长的内容,但不匹配。
(?=<)
表示匹配应在<
之前结束,但不包含<
本身。
我也建议您在wget命令中添加UA。
如果您不希望在结果后添加换行符,请删除\n
部分的"USD: %s.%s\n"
。
如果您需要 round 而不是截断,请在awk '{printf "USD: %.2f",$0}'
部分使用awk
。
-从您的示例中,我可以看到您想要截断,因为3.81990
将四舍五入到3.82
,但是您可能也需要此选项。
如果您不希望使用grep
部分,也可以使用(需要GNU awk):
wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F'[.>]' '/^span id=.?aq_usdpln(#1)?_c5/{printf "USD: %s.%s\n",$2,substr($3,1,2)}' RS='<'
或者这不需要GNU awk:
wget -q -O - "https://stooq.pl/q/?s=usdpln&c=3d&t=l&a=lg&b=0" | awk -F. 'sub(/^span id=.?aq_usdpln(#1)?_c5\"?>/,""){printf "USD: %s.%s\n",$1,substr($2,1,2)}' RS='<'